我有以下用Swift 5编写的脚本,在配置通用类时做错了。
[基本上是一个Foo
协议,其函数带有一个具有通用类型的参数,并且在Fez
和Foz
中都实现了,其中bar
函数的类型在类定义中定义。通过使用associatedtype
可以解决此问题吗?
关于可能的问题以及如何解决的任何想法?我在设置泛型时做错什么了吗?我需要同时支持Int
和String
。
protocol Foo {
func bar<T>(zed: T)
}
class Fez: Foo {
private var zed: Int = 0
func bar<Int>(zed: Int) {
self.zed = zed //Cannot assign value of type 'Int' to type 'Swift.Int'
}
}
class Foz: Foo {
private var zed: String = ""
func bar<String>(zed: String) {
self.zed = zed //Cannot assign value of type 'String' to type 'Swift.String'
}
}
非常感谢。
这样的泛型表示调用者可以选择任何类型传递给bar
,然后实现将对其进行处理。您的意思是,实现必须决定可以传递的类型,这就是您建议的关联类型。
protocol Foo {
associatedtype Zed
func bar(zed: Zed)
}
class Fez: Foo {
private var zed: Int = 0
func bar(zed: Int) {
self.zed = zed
}
}
class Foz: Foo {
private var zed: String = ""
func bar(zed: String) {
self.zed = zed
}
}