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
уточняю мои протоколы?