关于ios:在Objective-C中使用通用的Swift类

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从未添加到我的Project-Swift.h文件中。即使我将其更改为从nsObject继承,它仍然不会出现在swift.h文件中。

有没有办法创建一个通用的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服务。我使用的是Moya框架,我的服务就是这样的:

1
2
3
4
5
 class AuthService: BaseService<AuthAPI> {
    func register(email: String)  {
       // ...
    }
 }

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

所以这里有一个解决方法:

创建AuthServiceProtocol

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];
}