如何正确使用协议和不同类型的泛型?

问题描述 投票:0回答:1

我有以下用Swift 5编写的脚本,在配置通用类时做错了。

[基本上是一个Foo协议,其函数带有一个具有通用类型的参数,并且在FezFoz中都实现了,其中bar函数的类型在类定义中定义。通过使用associatedtype可以解决此问题吗?

关于可能的问题以及如何解决的任何想法?我在设置泛型时做错什么了吗?我需要同时支持IntString

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'
  }
}

非常感谢。

swift generics swift-protocols
1个回答
1
投票

这样的泛型表示调用者可以选择任何类型传递给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
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.