Быстрые протоколы и равные
Я все еще учусь работать с массивами объектов, реализующих протоколы со связанными типами.
У меня есть следующие протоколы:
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
Вы можете сравнивать только два объекта одного типа, которые соответствуют этому протоколу.