0

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

我有以下协议:

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和子类化WordCWordNSObject

基本上,我想使用实现 Word 类的不同类来实现数据源协议。这是我想写的那种代码,但显然它不能编译。

class MyDataSource : WordDataSource {

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

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

}

这在 Swift 中是否可行?我应该写什么来完成这项工作?

非常感谢你的帮助!

4

1 回答 1

0

这是不可能的,而且不可能是有原因的。让我们假设您的类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

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

于 2017-06-26T15:21:10.123 回答