我有一个需要使用类的Objective-C方法:
@interface A: NSObject
+ (id)produceSomethingOfClass:(Class)cls;
@end
我当前从Swift调用此代码的代码如下:
A.produceSomething(of: X.self) as? X
我想从Swift调用这种逻辑,还要使用泛型:
extension A {
// T needs to conform to `AnyObject` or the compilation will fail because
// the Objective-C version is expecting a `Class`
func typedProduceSomething<T: AnyObject>(of cls: T.Type) -> T? {
return A.produceSomething(of: T.self) as? T
}
}
对于符合T
的{{1}},这可以正常工作:
NSObject
但是,如果我使用值语义类型调用泛型方法,即使该类型可以桥接到Objective-C,它也会失败:
class SomeNSObject: NSObject {}
// No compile error
let someInstance = A.typedProduceSomething(of: SomeNSObject.self)
如果我使用桥接类型调用它,那么返回值是可选的,因此我无法将其转换回去:
// Compile error
A.typedProduceSomething(of: String.self)
有什么方法可以使// Compile error, can't convert NSString? to String?
let someInstance: String? = A.typedProduceSomething(of: NSString.self)
// Old method still works
let someInstance: String = A.produceSomething(of: NSString.self) as? String
与桥接到Objective-C的值类型一起工作?