在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中使用。
这不包括仅限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]; }