Передайте соединенный тип Swift в универсальную функцию, ожидающую AnyObject - PullRequest
1 голос
/ 04 июня 2019

У меня есть метод 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?

...