2017-06-26 345 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

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