2016-05-11 11 views
12

Warum unterstützt die schnelle Unterstützung die Rückgabe der Kovarianz in Methoden, die in Protokollen definiert sind? z. B.Rückgabetyp Kovarianz in Protokollmethoden

class Base { } 

class Derived : Base { } 

protocol Requirement { 
    var someVariable : Base { get } 
} 

struct MyStruct : Requirement{ 
let someVariable : Derived 
} 

Der Compiler erkennt einen Fehler, der MyStruct entspricht Protokoll Anforderung nicht. Soweit ich weiß, erfüllt MyStruct alle Anforderungen von LSP, also frage ich mich, warum das in Swift nicht erlaubt ist?

Antwort

0

Imagine Sie haben:

var requirement: Requirement? 

und Sie möchten eine Variable vom Typ zuweisen Base

let myBaseInstance = Base() 
requirement.someVariable = myBaseInstance 

Wenn Sie Ihre Struktur aussehen, dass nicht möglich wäre, da die Instanz von Base erbt nicht von Derived.

Mit anderen Worten, ist dies nicht möglich wäre (aber es muss durch Definition des Protokolls möglich sein):

var requirement: Requirement? = MyStruct() 
requirement.someVariable = myBaseInstance //error 

Sie einen Fehler in Zeile 2, weil somevariable Derived vom Typ sein muss, aber myBaseInstance ist nur vom Typ Base und entspricht möglicherweise nicht Derived.

0

Kontext ist hier wichtig, also weiß ich nicht, ob das Sie bekommen wird, was Sie wollen.

Meine Antwort ist associatedtype verwenden.

Beginnen Sie mit dem gleichen Setup

class Base { } 
class Derived: Base { } 

Dieses Mal werde ich einen Typen in dem Protokoll definieren, die eine Art von Base sein muss.

protocol Requirement { 
    associatedtype KindOfBase: Base 
    var someVariable: KindOfBase { get } 
} 

Jetzt bekommen Sie, was Sie wollen.

struct MyStruct: Requirement { 
    let someVariable: Derived 
} 

struct MyStruct2: Requirement { 
    let someVariable: Base 
}