Verhalten von Protokollen mit Selbst

8

Ich habe kürzlich Protokolle, Generic Type Constraints und Arrays in Swift . Meine Frage betrifft die folgenden zwei Beispiele aus dem Blog:

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.

%Vor%

Kennt jemand die Ursache dieses scheinbar seltsamen Verhaltens?

    
ABakerSmith 06.05.2015, 12:45
quelle

2 Antworten

2

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ückgeben

2) Erstellen Sie ein Array von Generics, die protocol2

entsprechen     
JoeyBartez 28.08.2015 00:24
quelle
0

Ich 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.

    
Abdullah 06.05.2015 13:43
quelle

Tags und Links