Erstellen eines Protokolls, das für ein- oder ausschaltbare Objekte steht

9

Ich versuche ein einfaches Protokoll zu erstellen, das besagt, ob ein Objekt in einem "An" -Zustand oder in einem "Aus" -Zustand ist. Die Interpretation dessen, was das ist, hängt von dem implementierenden Objekt ab. Bei einem UISwitch ist es egal, ob der Schalter ein- oder ausgeschaltet ist (duh). Für UIButton könnte es sein, ob die Schaltfläche im selected -Zustand ist oder nicht. Für ein Car könnte es sein, ob der Motor des Autos eingeschaltet ist oder nicht, oder ob es sich bewegt oder nicht. Also machte ich mich daran, dieses einfache Protokoll zu erstellen:

%Vor%

Jetzt kann ich die oben genannten UI-Steuerelemente wie folgt erweitern:

%Vor%

Nun kann ich ein Array dieser Art von Objekten erstellen und eine Schleife darüber legen, ob sie ein- oder ausgeschaltet sind:

%Vor%

Großartig! Jetzt möchte ich ein Wörterbuch erstellen, das diese Steuerelemente einem UILabel zuordnet, so dass ich den Text des Labels ändern kann, das mit dem Steuerelement verknüpft ist, wenn das Steuerelement den Status ändert. Also gehe ich, um mein Wörterbuch zu deklarieren:

%Vor%

Oh! Recht! Wie dumm von mir. Ok, also lass mich nur das Protokoll mit Protokollzusammensetzung aktualisieren (schließlich sind die Steuerelemente, die ich hier verwenden möchte, alle Hashable: UISwitch, UIButton, etc):

%Vor%

Aber jetzt bekomme ich eine neue Reihe von Fehlern:

%Vor%

Ok ... Also mache ich einen Stapel Überlauf graben und suchen. Ich finde viele Artikel, die vielversprechend erscheinen, wie Set und Protokolle in Swift , Verwendung eines Protokolls als konkreter Typ die Übereinstimmung mit einem anderen Protokoll wird nicht unterstützt , und ich sehe, dass es auf type erasure einige großartige Artikel gibt, die genau das zu sein scheinen, was ich brauche: Ссылка , Ссылка , und Ссылка um nur ein paar zu nennen.

Hier bleibe ich jedoch stecken. Ich habe versucht, all diese zu lesen, und ich habe versucht, eine Klasse zu erstellen, die Hashable sein wird und auch mit meinem OnOffRepresentable Protokoll übereinstimmt, aber ich kann nicht herausfinden, wie man alles verbindet.

    
Tim Fuqua 19.08.2016, 23:29
quelle

2 Antworten

3

Ich weiß nicht, ob ich das OnOffRepresentable -Protokoll unbedingt von Hashable erben lassen würde. Es scheint nicht, dass etwas, das Sie als ein oder aus muss dargestellt werden sollte auch als hashable. Also füge ich in meiner Implementierung unten die Hashable -Konformität nur dem Typ-Lösch-Wrapper hinzu. Auf diese Weise können Sie direkt auf OnOffRepresentable -Elemente verweisen (ohne die Warnung "kann nur in einer generischen Integritätsbedingung verwendet werden") und sie nur innerhalb des HashableOnOffRepresentable -Typ-Radierers umschließen, wenn Sie sie in Sets platzieren oder verwenden müssen sie als Wörterbuchschlüssel.

%Vor%     
Daniel Hall 20.08.2016, 00:11
quelle
0

Wenn Sie ein Protokoll mit einem associatedType erstellen (oder einem anderen Protokoll mit einem associatedType like Hashable entsprechen), wird dieses Protokoll mit Generics sehr unfreundlich.

Ich schlage Ihnen eine sehr einfache Problemumgehung vor

OnOffRepresentable

Zuerst brauchen wir nicht 2 Funktionen, die genau das Gegenteil sagen, oder? ;)

Also das

%Vor%

wird dies

%Vor%

und natürlich

%Vor%

Ein OnOffRepresentable mit einem UILabel verbinden

Jetzt können wir OnOffRepresentable nicht als Key von Dictionary verwenden, da unser Protokoll Hashable sein muss. Dann verwenden wir eine andere Datenstruktur!

%Vor%

Das ist es.

    
Luca Angeletti 20.08.2016 00:35
quelle