Ковариация возвращаемого типа в методах протокола

Почему не быстродействующая поддержка возвращает тип 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
}