2015-09-04 160 views
13

比方说,我定义斯威夫特一个泛型类,类似以下内容:在Objective-C使用泛型雨燕类

class MyArray<T> { 
    func addObject(object: T) { 
     // do something... hopefully 
    } 
} 

(我知道有一个稍微更好地落实阵列,这是仅仅是一个例子)

在斯威夫特我现在可以使用这个类很容易:

let a = MyArray<String>() 
a.addObject("abc") 

With Xcode 7, we now have generics in Objective-C,所以我会认为我合作ULD使用这个类在Objective-C:

MyArray<NSString*> *a = [[MyArray<NSString*> alloc] init]; 
[a addObject:@"abc"]; 

然而,MYARRAY从未添加到我的Project-Swift.h文件。即使我将其更改为从NSObject继承,它仍然不会出现在我的Swift.h文件中。

有什么办法来创建一个通用斯威夫特类,然后在Objective-C使用它呢?


更新:如果我尝试从NSObject的继承与@objc注释:

@objc(MyArray) 
class MyArray<T>: NSObject { 
    func addObject(object: T) { 
     // do something... hopefully 
    } 
} 

我得到以下编译器错误:

Generic subclasses of '@objc' classes cannot have an explicit '@objc' attribute because they are not directly visible from Objective-C.

这是否意味着有没有办法在Objective-C中使用通用的Swift类?

如何之一直接参考类?

+0

你用@objc注释了你的类吗? –

+0

@MrBeardsley我只是试过了,它给了一个有趣的编译器错误(见上文)。 – Senseful

回答

17

无法在Objective-C中使用Swift泛型。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID136

This excludes Swift-only features such as those listed here:

  • Generics
  • ...
+0

是否为Xcode 7更新了该文档?由于Objective-C中现在有泛型,它不会被认为是Swift-only特性吗? – Senseful

+1

@Senseful:Objective-C中的轻量级泛型与Swift泛型不同,也比Swift泛型更受限制。 – newacct

+0

@newacct你知道一个描述限制的网页吗? – finneycanhelp

0

有一些情况下解决方法,当你需要导入斯威夫特泛型类成Objective-C的。

比方说,您有使用泛型的Swift REST服务。我使用Moya框架,这就是我的服务看起来像:

class AuthService: BaseService<AuthAPI> { 
    func register(email: String) { 
     // ... 
    } 
} 

这是一个从基础服务使用泛型继承,所以我不能在我的Objective-C代码直接使用它。

所以这里是一个解决办法:

让我们创建AuthServiceProtocol

@objc protocol AuthServiceProtocol { 
    func register(email: String) 
} 

然后让我们创建服务织物(或单方法,没有区别):

@objc class Services: NSObject { 
    static let authService: AuthServiceProtocol = AuthService() 
} 

然后我可以从Objective-C代码中调用我的通用Swift验证服务:

- (void)someObjcMethod { 
    [Services.authService registerWithEmail:self.email]; 
} 
+0

我成功地在我的obj-c类中调用服务但是,当我尝试使用authService时会出现错误。 “在'Services'类型的对象上找不到'Property'authService'。请帮我解决这个问题 –