2017-06-26 261 views
0

我仍然在學習如何使用相關類型實現協議的對象數組。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? 

} 

我有WordAWordBWordC所有執行Word和子類NSObject

基本上,我想要實現使用不同種類的類實現數據源協議詞類。這是我想寫的那種代碼,但顯然它不能編譯。

class MyDataSource : WordDataSource { 

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

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

} 

這甚至可能在Swift中嗎?我應該寫什麼來完成這項工作?

非常感謝您的幫助!

回答

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

只能比較符合這個協議的兩個同類型的對象。