Swift协议和equatable
问题描述:
我仍然在学习如何使用相关类型实现协议的对象数组。Swift协议和equatable
我有以下协议:
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?
}
我有WordA
,WordB
和WordC
所有执行Word
和子类NSObject
基本上,我想要实现使用不同种类的类实现数据源协议词类。这是我想写的那种代码,但显然它不能编译。
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
协议的定义:
public static func ==(lhs: Self, rhs: Self) -> Bool
只能比较符合这个协议的两个同类型的对象。