我试图理解为什么用协议实例调用泛型函数会导致编译错误。给出以下代码:
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
- 如果我的协议?