如何正确使用具有协议和不同类型的泛型?
How to correctly use generics with protocols and different types?
我在 Swift 5 中编写了下面的脚本,但我在配置泛型方面做错了。
基本上它是一个 Foo
协议,其函数具有一个泛型类型的参数,它在 Fez
和 Foz
中实现,其中 [=14] 的类型=]函数定义在class定义中。通过使用 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
}
}
我在 Swift 5 中编写了下面的脚本,但我在配置泛型方面做错了。
基本上它是一个 Foo
协议,其函数具有一个泛型类型的参数,它在 Fez
和 Foz
中实现,其中 [=14] 的类型=]函数定义在class定义中。通过使用 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
}
}