Swift: вызов универсальной функции с экземпляром протокола

Я пытаюсь понять, почему вызов универсальной функции с экземпляром протокола приводит к ошибке компиляции. Учитывая следующий код:

public protocol MyProtocol {}
public class MyClass: MyProtocol {}

public func myFunc<T: MyProtocol>(_ foo: T) -> T {
    return foo
}

public func test() {
    let foo: MyClass = MyClass()
    let bar: MyProtocol = foo

    myFunc(foo)  // ok
    myFunc(bar)  // compile error
}

Компилятор терпит неудачу таким образом: cannot invoke 'myFunc' with an argument list of type '(MyProtocol)' на myFunc(bar) заявление.

декларирование MyProtocol как @objc позволяет скомпилировать пример (предположительно, потому что он заставляет MyProtocol стать неким конкретным типом за кулисами или чем-то в этом роде?).

Почему это запрещено в Swift, и есть ли более хороший обходной путь, чем @objcуточняю мои протоколы?

0 ответов

Другие вопросы по тегам