Ковариация возвращаемого типа в методах протокола
Почему не быстродействующая поддержка возвращает тип covarience в методах, определенных в протоколах? например
class Base { }
class Derived : Base { }
protocol Requirement {
var someVariable : Base { get }
}
struct MyStruct : Requirement{
let someVariable : Derived
}
Компилятор подтверждает ошибку, которую MyStruct не соответствует требованиям протокола. Насколько я знаю, MyStruct выполняет все требования LSP, поэтому мне интересно, почему это не разрешено в Swift?
Ответы
Ответ 1
Представьте, что у вас есть:
var requirement: Requirement?
и вы хотите назначить переменную типа Base
let myBaseInstance = Base()
requirement.someVariable = myBaseInstance
Если вы посмотрите на свою структуру, это будет невозможно, поскольку экземпляр базы не наследуется от Derived
.
Другими словами, это было бы невозможно (но это должно быть возможно по определению протокола):
var requirement: Requirement? = MyStruct()
requirement.someVariable = myBaseInstance //error
Вы получаете ошибку в строке 2, потому что someVariable должен иметь тип Derived
, но myBaseInstance
имеет тип Base
только и может не соответствовать Derived
.
Ответ 2
Контекст здесь очень важен, поэтому я не знаю, поможет ли это вам, чего вы хотите.
Мой ответ - использование associatedtype
.
Начните с той же настройки
class Base { }
class Derived: Base { }
На этот раз я определю тип в протоколе, который должен быть чем-то вроде Base
.
protocol Requirement {
associatedtype KindOfBase: Base
var someVariable: KindOfBase { get }
}
Теперь вы получаете то, что хотите.
struct MyStruct: Requirement {
let someVariable: Derived
}
struct MyStruct2: Requirement {
let someVariable: Base
}