Быстрые протоколы и равные

Я все еще учусь работать с массивами объектов, реализующих протоколы со связанными типами.

У меня есть следующие протоколы:

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? Что я должен написать, чтобы сделать эту работу?

Большое спасибо за вашу помощь!

1 ответ

Это невозможно, и это невозможно по причине. Давайте предположим, что ваш класс 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

Вы можете сравнивать только два объекта одного типа, которые соответствуют этому протоколу.

Другие вопросы по тегам