Ich habe kürzlich Protokolle, Generic Type Constraints und Arrays in Swift
Der Code:
%Vor%Erzeugt den Fehler:
Protokoll 'MyProtocol1' kann nur als generische Einschränkung verwendet werden, weil Es hat Selbst- oder zugehörige Typanforderungen.
Das wird erwartet und es gab mehrere SO-Fragen bezüglich des Themas. Wenn Sie jedoch myValue
in eine Funktion ändern, gibt es keinen Fehler mehr, aber in beiden Fällen wird Self
zurückgegeben.
Kennt jemand die Ursache dieses scheinbar seltsamen Verhaltens?
In diesem Video wird etwa 18 Minuten erklärt: Ссылка
Da Ihr Protokoll auf "self" verweist, kann es nur als allgemeine Einschränkung und nicht als Typ verwendet werden.
Beispiel: Nehmen wir an, 2 Strukturen implementieren Ihr Protokoll - Duke & amp; Silber.
Wenn Sie ein Array von protocol2 ([protocol2]) erstellt haben, könnte Ihr Array entweder Dukes are Silvers enthalten.
myValue gibt ausdrücklich an, dass der Rückgabewert self sein muss. Dies bedeutet, dass ein Herzog einen Herzog zurückgeben muss und ein Silber ein Silber zurückgeben muss. Als solche können Sie nicht Dukes & amp; Silvers im selben Array, weil ihre MyValue-Funktionen unterschiedliche Rückgabewerte haben.
Um das Problem zu beheben, können Sie entweder:
1) Machen Sie den Rückgabetyp von myValue protocol2 so, dass Dukes und Silvers beide nur einen protocol2 type
zurückgeben2) Erstellen Sie ein Array von Generics, die protocol2
entsprechenIch habe keine definitive Antwort darauf, aber ich denke, das liegt an der Klassengröße und dem internen Layout.
Wenn Sie einen assoziierten Typ oder ein Self-Typ-Element haben, wirkt sich dies auf die Größe des Objekts und damit auf die Array-Größe aus. Die Verwendung der Methode Self als Methoden-Rückgabetyp beeinflusst jedoch die Objektgröße.