Using a generic Swift class in Objective-C
假设我在swift中定义了一个泛型类,类似于以下内容:
1 2 3 4 5 | class MyArray<T> { func addObject(object: T) { // do something... hopefully } } |
(我知道有更好的数组实现,这只是一个例子。)
在Swift中,我现在可以很容易地使用这个类:
1 2 | let a = MyArray<String>() a.addObject("abc") |
使用xcode 7,我们现在在objective-c中有了泛型,因此我假设我可以在objective-c中使用这个类:
1 2 | MyArray<NSString*> *a = [[MyArray<NSString*> alloc] init]; [a addObject:@"abc"]; |
但是,myarray从未添加到我的
有没有办法创建一个通用的Swift类,然后在Objective-C中使用它?
更新:如果我尝试从nsobject继承并用@objc注释:
1 2 3 4 5 6 | @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类的方法?
如何间接引用类?
Swift泛型类型不能在Objective-C中使用。
https://developer.apple.com/library/content/documentation/swift/conceptive/buildingcoaapps/mixandmatch.html//apple-ref/doc/uid/tp40014216-ch10-id136
This excludes Swift-only features such as those listed here:
- Generics
- ...
当您需要将Swift泛型类导入到Objective-C中时,有一个针对某些情况的变通方法。
假设您拥有使用泛型的Swift Rest服务。我使用的是
1 2 3 4 5 | class AuthService: BaseService<AuthAPI> { func register(email: String) { // ... } } |
它是从使用泛型的基本服务继承的,所以我不能直接在我的Objective-C代码中使用它。
所以这里有一个解决方法:
创建
1 2 3 | @objc protocol AuthServiceProtocol { func register(email: String) } |
然后让我们为服务创建一个工厂(或者单例方法,没有区别):
1 2 3 | @objc class Services: NSObject { static let authService: AuthServiceProtocol = AuthService() } |
然后我可以从Objective-C代码调用我的通用Swift认证服务:
1 2 3 | - (void)someObjcMethod { [Services.authService registerWithEmail:self.email]; } |