gpt4 book ai didi

Swift 协议(protocol)和 Equatable

转载 作者:行者123 更新时间:2023-11-30 12:21:16 25 4
gpt4 key购买 nike

我仍在学习如何使用对象数组来实现具有关联类型的协议(protocol)。

我有以下协议(protocol):

public protocol Word : Equatable, Hashable { // compiles

associatedtype WordType : Equatable

var moreWords: [WordType] { get }

}

public protocol WordDataSource { // compiles

associatedtype SomeWord : Word

func findWord(spelling: String) -> SomeWord?

}

我有 WordAWordBWordC 都实现了 Word 并子类化了 NSObject

基本上,我想使用实现 Word 类的不同类型的类来实现数据源协议(protocol)。这是我想编写的代码,但显然它无法编译。

class MyDataSource : WordDataSource {

func findWord(spelling: String) -> SomeWord? {

if conditionA {
return WordA()
}
if conditionB {
return WordB()
}
if conditionA {
return WordC()
}
}

}

这在 Swift 中可能吗?我应该写什么才能实现这一点?

非常感谢您的帮助!

最佳答案

这是不可能的,而且不可能是有原因的。假设您的类 MyDataSource 确实可以编译。现在,我们可以编写这样的代码:

let fooWord = MyDataSource().findWord(spelling: "Foo") // Would return WordA instance
let barWord = MyDataSource().findWord(spelling: "Bar") // Would return WordB instance

但我们对这两种类型的了解仅限于它们属于 SomeWord 类型。所以它们应该具有可比性,因为 Word 具有可比性,对吗?

但它们是两种完全不同的类型,那么您怎么知道应该如何比较它们呢?看一下Equatable协议(protocol)的定义:

public static func ==(lhs: Self, rhs: Self) -> Bool

您只能比较符合此协议(protocol)的相同类型的两个对象。

关于Swift 协议(protocol)和 Equatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44762091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com