У меня есть метод 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
, соответствующего NSObject
, это прекрасно работает:
class SomeNSObject: NSObject {}
// No compile error
let someInstance = A.typedProduceSomething(of: SomeNSObject.self)
ОднакоЕсли я вызову универсальный метод со значением-семантическим типом, он завершится неудачей, даже если тип может быть соединен с Objective-C:
// 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
Есть ли способ заставить typedProduceSomething
работать с типами значений, соединенными с Objective-C?