将桥接的Swift类型传递给需要AnyObject的泛型函数

时间:2019-06-04 11:58:44

标签: ios objective-c swift generics

我有一个需要使用类的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的值类型一起工作?

0 个答案:

没有答案