我很困惑...我什至不知道编译器认为会发生什么,但是我有90%的把握这应该是可能的:

class Generic<Type: Any> {

}

protocol Foo {
    func bar(_ baz: Generic<Any>)
}

class SomeFoo: Foo {
    func bar(_ baz: Generic<Any>) {
        print("Got", baz)
    }
}

let someFoo = SomeFoo()
let generic = Generic<String>()

someFoo.bar(generic) // Compile error: Cannot convert value of type 'Generic<String>' to expected argument type 'Generic<Any>'

这是怎么回事,有什么解决方法?当然,必须有一些解决方法...

最佳答案

这称为协方差,Swift中的用户类型不支持这种协方差(据我所知,数组除外)。 BTW Objective-C泛型以某种方式支持协方差。
在您的情况下,我可以从2个选项中进行选择:

  • 使条形函数通用
  • 创建将被foo函数接受的非通用协议(protocol),并在Generic
  • 中实现该协议(protocol)

    关于swift - 无法将 'Generic<String>'类型的值转换为预期参数类型 'Generic<Any>',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41516327/

    10-10 21:14