Wenn AnyObject im Protokoll erforderlich ist, bedeutet dies, dass das children
-Array AnyObject
-Einträge akzeptieren muss. Aber es klingt so, als ob Bar
's Kinder nur Foo
Objekte sein sollen.
Stattdessen können Sie dem Protokoll ein zugehöriger Typ :
%Vor%Wenn Sie immer ein Array vom Typ AnyObject haben möchten, müssen Sie es in Ihrer Klasse angeben:
%Vor% Wenn Sie jedoch ein spezifischeres Protokoll mit typealias
verwenden können, können Sie Ihr Protokoll wie folgt neu schreiben:
Auf diese Weise funktioniert Ihre frühere Konformität Ihrer Klasse, aber Sie müssen berücksichtigen, dass dieses Protokoll nur als generische Einschränkung und daher nur in Funktionen und generischen Deklarationen verwendet werden kann:
%Vor%Wenn das Protokoll feststellt, dass es Getter und Setter vom Typ [AnyObject] gibt, bedeutet das, dass es einen solchen Getter und Setter geben muss, nicht den Subtyp dieser Klasse.
Ihr Code wäre logisch falsch - weil Sie in der Lage wären, zB [Int] (Protokoll sagt es ist möglich) auf die Variable vom Typ [Foo] (Klasse habe nur diese Var)
zu setzenDas ist also eigentlich der einzig richtige Weg.
%Vor%In swift 2.0 könnte die Typalias eine andere Option sein.
Nein, Sie können den Typ einer Eigenschaft nicht ändern.
Fügen Sie dies Ihrer Bar-Klasse hinzu:
%Vor%Alternative zur Protokollantwort, die Ihnen einige Vorteile bietet, die ein Protokoll nicht bietet.
%Vor%Related: Wie in Swift geben Sie type constraint als Aufzählung an ?