【发布时间】:2017-01-07 00:03:24
【问题描述】:
我很困惑...我什至不知道编译器认为会发生什么,但我有 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>'
这里发生了什么,解决方法是什么?当然必须有一些解决方法......
【问题讨论】:
-
为什么
Generic<String>可以转换为Generic<Any>?(String)->Void不能转换为(Any)->Void。用户定义的泛型类型不支持协变。 en.wikipedia.org/wiki/… -
但是
String is Any...如果函数接受Any,我给它一个String,它就不会抱怨 -
String是Any,但(String)->Void不是(Any)->Void。我的观点是,不能假设这总是有效。某些语言允许您指定它应该工作;当前版本的 Swift 不是其中之一。 -
为了清楚起见,假设你有一个函数
f(_: String) -> Void。然后假设您有func callFunc(_ x: (Any) -> Void)) { x(42) },这是完全有效的代码。如果(String)->Void可以转换为(Any)->Void,你就可以调用callFunc(f),这显然是无效的,因为42不是字符串。 -
@jtbandes 这是一个很好的答案:D
标签: swift generics compiler-errors swift3