在Objective-C中使用通用的Swift类

假设我在Swift中定义了一个generics类,类似于以下内容:

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

(我知道有一个稍微好一点的数组实现,这只是一个例子。)

在Swift中,我现在可以非常轻松地使用这个类:

 let a = MyArray() a.addObject("abc") 

使用Xcode 7,我们现在在Objective-C中有generics ,所以我假设我可以在Objective-C中使用这个类:

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

但是,MyArray永远不会添加到我的Project-Swift.h文件中。 即使我将其更改为inheritance自NSObject,它仍然不会出现在我的Swift.h文件中。

有没有办法创建一个通用的Swift类,然后在Objective-C中使用它?


更新:如果我尝试从NSObjectinheritance并使用@objc注释:

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

我收到以下编译器错误:

‘@objc’类的通用子类不能具有明确的’@objc’属性,因为它们不能直接从Objective-C中看到。

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

如何直接引用该类?

Swiftgenerics类型不能在Objective-C中使用。

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

这不包括仅限Swift的function,例如此处列出的function:

  • generics

当您需要将Swiftgenerics类导入Objective-C时,某些情况有一种解决方法。

假设你有Swift REST服务,它使用Generics。 我正在使用Moya框架,这就是我的服务的样子:

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

它是使用generics从基本服务inheritance的,所以我不能直接在Objective-C代码中使用它。

所以这是一个解决方法:

让我们创建AuthServiceProtocol

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

然后让我们创建一个服务工厂(或单例方法,没有区别):

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

然后我就可以从Objective-C代码调用我的通用Swift auth服务:

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