无法转换类型&#39; Generic <string>&#39;的值预期参数类型&#39; Generic <any>&#39;

时间:2017-01-07 00:03:25

标签: swift generics compiler-errors swift3

我感到困惑......我甚至不知道编译器认为可能会发生什么,但我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>'

这里发生了什么,以及解决方法是什么?当然必须有一些解决方法......

1 个答案:

答案 0 :(得分:1)

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

  1. 使条形函数通用
  2. 创建非通用协议,该协议将被foo函数接受并在Generic类中实现此协议