我还在学习如何使用对象数组来实现具有相关类型的协议。
我有以下协议:
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
基本上,我希望使用实现Word类的不同类型的类来实现数据源协议。这是我想要写的代码,但很明显它不能编译。
class MyDataSource : WordDataSource {
func findWord(spelling: String) -> SomeWord? {
if conditionA {
return WordA()
}
if conditionB {
return WordB()
}
if conditionA {
return WordC()
}
}
}这在Swift中是可能的吗?我应该写些什么才能让它工作呢?
非常感谢你的帮助!
发布于 2017-06-26 23:21:10
这是不可能的,而且这是有原因的。让我们假设您的类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
您只能比较符合此协议的同一类型的两个对象。
https://stackoverflow.com/questions/44762091
复制相似问题