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

Sen*_*ful 22 generics objective-c ios swift

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

class MyArray<T> {
    func addObject(object: T) {
        // do something... hopefully
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

let a = MyArray<String>()
a.addObject("abc")
Run Code Online (Sandbox Code Playgroud)

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

MyArray<NSString*> *a = [[MyArray<NSString*> alloc] init];
[a addObject:@"abc"];
Run Code Online (Sandbox Code Playgroud)

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

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


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

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

我得到以下编译器错误:

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

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

如何直接引用该类?

new*_*cct 22

Swift泛型类型不能在Objective-C中使用.

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

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

  • 泛型
  • ...

  • @Senseful:Objective-C中的轻量级泛型与Swift泛型不同,并且更加有限. (2认同)

med*_*ick 6

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

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

 class AuthService: BaseService<AuthAPI> {
    func register(email: String)  {
       // ... 
    }
 }
Run Code Online (Sandbox Code Playgroud)

它是使用泛型从基本服务继承的,所以我不能直接在Objective-C代码中使用它.

所以这是一个解决方法:

让我们创建AuthServiceProtocol:

@objc protocol AuthServiceProtocol {
    func register(email: String)
}
Run Code Online (Sandbox Code Playgroud)

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

@objc class Services: NSObject {
    static let authService: AuthServiceProtocol = AuthService()
}
Run Code Online (Sandbox Code Playgroud)

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

- (void)someObjcMethod {
    [Services.authService registerWithEmail:self.email];
}
Run Code Online (Sandbox Code Playgroud)

  • 如果 registerWithEmail 想要返回某种泛型类怎么办:) (2认同)