请考虑以下代码:

protocol Foo {
    func f() -> Void
}

class Bar1: Foo {
    func f() {
        print("Bar1 f")
    }
}

class Bar2: Foo {
    func f() {
        print("Bar2 f")
    }
}

func function<T:Foo>(arg:T = Bar2()) {
    arg.f()
}

它给出了一个错误Value of type Bar2 cannot be converted to type T,这似乎完全是胡说八道,因为T保证与Foo兼容,这是赋值操作的上下文。
为了证明这一点:
let global: Foo = Bar2()
global.f()

这很管用。
我想知道为什么这样的差异存在,如果有任何解决办法呢?

最佳答案

Bar2()转换为泛型类型T

func function<T:Foo>(arg:T = Bar2() as! T) {
        arg.f()
}

10-08 01:51