Musterprotokoll ändern

Hier sind zwei Klassen, Circle und Country, die beide dem HasArea-Protokoll entsprechen: Sie können ein Protokoll an vielen Stellen verwenden, wo andere Typen erlaubt sind, einschließlich: Ein Protokoll kann als Typ verwendet werden, der in einer Auflistung wie einem Array oder einem Wörterbuch gespeichert werden soll, wie in Protokollen als Typen erwähnt. In diesem Beispiel wird ein Array von TextRepresentable-Dingen erstellt: Da Sie dynamisch auswählen müssen, welches Protokoll verwendet werden soll, scheint die Verwendung verschiedener Klassen (anstelle eines Vorlagenparameters) für die Auswahl der Protokollversion der richtige Weg zu sein. Im Wesentlichen ist dies Strategie-Muster, obwohl Besucher wäre auch eine Möglichkeit, wenn Sie wirklich aufwendig werden wollte. Wenn Sie eine Protokollinstanz-Methodenanforderung definieren, die Instanzen eines beliebigen Typs mutieren soll, der das Protokoll annimmt, markieren Sie die Methode mit dem Mutating-Schlüsselwort als Teil der Protokolldefinition. Dies ermöglicht es Strukturen und Enumerationen, das Protokoll zu übernehmen und diese Methodenanforderung zu erfüllen. Beispielsweise kann dieses Protokoll, das als TextRepresentable bezeichnet wird, von jedem Typ implementiert werden, der eine Möglichkeit hat, als Text dargestellt zu werden. Dies kann eine Beschreibung von sich selbst oder eine Textversion des aktuellen Status sein: Das FullyNamed-Protokoll erfordert einen konformen Typ, um einen vollqualifizierten Namen bereitzustellen. Das Protokoll gibt nichts anderes über die Art des konformen Typs an – es gibt nur an, dass der Typ in der Lage sein muss, einen vollständigen Namen für sich selbst bereitzustellen. Das Protokoll gibt an, dass jeder FullyNamed-Typ über eine gettable-Instanzeigenschaft namens fullName verfügen muss, die vom Typ String ist.

In ähnlicher Weise kann die SnakesAndLadders-Spielklasse erweitert werden, um das TextRepresentable-Protokoll anzunehmen und anzupassen: Die Circle-Klasse implementiert die Gebietseigenschaftsanforderung als berechnete Eigenschaft, basierend auf einer gespeicherten Radiuseigenschaft. Die Länderklasse implementiert die Flächenanforderung direkt als gespeicherte Eigenschaft. Beide Klassen entsprechen korrekt dem HasArea-Protokoll. Sie müssen Protokollinitialisiererimplementierungen nicht mit dem erforderlichen Modifikator für Klassen markieren, die mit dem endgültigen Modifikator markiert sind, da finale Klassen nicht unterclassiert werden können. Weitere Informationen zum endgültigen Modifikator finden Sie unter Verhindern von Überschreibungen. Je nach Protokoll und den Unterschieden können Sie mit TMP für Zustandsmaschinen oder Protokolldetails einen gewissen Gewinn erzielen, aber das Generieren von sechs Sätzen von Code, der die sechs Protokollversionen verwendet, lohnt sich wahrscheinlich nicht; Laufzeitpolymorphismus ist ausreichend, und in den meisten Fällen IST TCP EIs wahrscheinlich langsam genug, um nicht alles hart codieren zu wollen. Hier ist ein Beispiel, das zwei Protokolle namens Named and Aged in einer einzigen Protokollzusammensetzungsanforderung für einen Funktionsparameter kombiniert: Das Beispiel definiert auch einen wishHappyBirthday(to:) Funktion. Der Typ des Celebratorparameters ist Named & Aged, d. h. «jeder Typ, der sowohl den Protokollen Named als auch Aged entspricht.» Es spielt keine Rolle, welcher bestimmte Typ an die Funktion übergeben wird, solange er beiden erforderlichen Protokollen entspricht.