Wie erstelle ich ein Standard für die Implementierung einer Objective-C-Protokoll?
Ich würde gerne geben Sie eine Objective-C-Protokoll mit einem optionalen routine. Wenn die routine ist nicht von einer Klasse implementiert, der konform zum Protokoll ich verwenden möchte, eine default-Implementierung an seinem Platz. Gibt es einen Ort in das Protokoll selbst, wo kann ich definieren das default-Implementierung? Wenn nicht, was ist die beste Praxis zu reduzieren, kopieren und einfügen von dieser Standard-Implementierung alle über dem Platz?
- Dieser Beitrag bietet eine elegante, innovative Lösung: verwenden Sie eine Kategorie auf NSObject. stackoverflow.com/questions/19329309/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Objective-C-Protokolle haben keine affordance für Standard-Implementierungen. Sie sind Reine Sammlungen von Methodendeklarationen implementiert werden können, die von anderen Klassen. Die standard-Praxis in Objective-C ist für die Prüfung eines Objekts zur Laufzeit zu sehen, ob es reagiert auf die gegebenen Auswahl vor dem Aufruf der Methode auf, mit -[NSObject respondsToSelector:]. Wenn e-Objekt antwortet nicht auf die gegebenen Auswahl die Methode nicht aufgerufen.
Eine Möglichkeit, Sie könnte erreichen das Ergebnis, die Sie suchen zu definieren, eine Methode, welche die Standard-Verhalten, die Sie suchen in der aufrufenden Klasse, und rufen Sie diese Methode, wenn das Objekt nicht den test zu bestehen.
Ein weiterer Ansatz wäre die Methode benötigt werden, in das Protokoll, und bieten Standard-Implementierungen in den Oberklassen der Klassen, wobei Sie vielleicht nicht wollen, um eine bestimmte Implementierung.
Wahrscheinlich gibt es auch andere Möglichkeiten, aber im Allgemeinen gibt es nicht eine bestimmte standard-Praxis in Objective-C, außer vielleicht einfach nur nicht der Aufruf der Methode gegeben, wenn es nicht mehr implementieren, indem Sie das Objekt, pro meinen ersten Absatz oben.
Es gibt keine standard-Weg, dies zu tun, als Protokolle sollten nicht eine beliebige Implementierungen.
Da Objective-C kommt mit einer ordentlichen Laufzeit, natürlich können Sie solch ein Verhalten, wenn Sie wirklich denken, Sie brauchen, um es so zu machen (und es gibt keine Möglichkeit, durch die Erreichung derselben mit Vererbung).
Sagen, Sie erklärt MyProtocol, dann fügen Sie einfach eine Schnittstelle mit dem gleichen Namen in der .h-Datei, die unter Ihrem Protokoll Erklärung:
Und erstellen eine entsprechende Umsetzung-Datei (mit MAObjCRuntime für die Lesbarkeit hier, aber die standard-runtime-Funktionen wäre nicht viel mehr code):
Dann sind Sie nur noch zu nennen
in der Initialisierung der Klasse gemäß dem Protokoll und alle Standard-Methoden Hinzugefügt werden.
Eine wirklich faszinierende Möglichkeit ist die Verwendung der runtime. Beim start-up, die sehr früh in der Ausführung des Programms, führen Sie die folgenden:
Kann erreicht werden, ohne dass viel Mühe.
Als Ryan erwähnt gibt es keine default-Implementierungen für Protokolle, eine andere Möglichkeit der Implementierung in der Superklasse wäre, ist die Umsetzung einer "Handler" Art von Klasse, die enthalten sein können, in jeder Klasse die default-Implementierung, die entsprechende Methode ruft dann die Standard-Handler-Implementierung.
Ich landete erstellen Sie ein makro, die eine default-Implementierung der Methode.
Ich definiert habe es in dem Protokoll-header-Datei, und dann ist es nur ein one-liner in der jeweiligen Implementierung.
Diese Weise, die ich nicht ändern Sie die Implementierung mehrere Orte, und es ist getan auf compile-Zeit, also kein run-time-Magie notwendig ist.
Ich Stimme mit "w.m." Eine sehr schöne Lösung ist, um alle Standard-Implementierungen in einer Schnittstelle (mit dem gleichen Namen wie das Protokoll). In der "+initialize" - Methode für jede Unterklasse kann es einfach kopieren Sie eine nicht-implementierte Methoden aus dem Standard-interface in sich selbst.
Die folgenden Hilfsfunktionen für mich gearbeitet
Dann rufen Sie es in Ihrer Klasse Initialisierer wie...
Xcode geben Sie Warnungen über Foobar fehlende Methoden, aber Sie können Sie ignorieren.
Diese Technik kopiert nur die Methoden, nicht ivars. Wenn die Methoden greifen auf Datenelemente, die nicht existieren, konnte man seltsame bugs. Sie müssen sicherstellen, dass die Daten kompatibel mit dem code. Es ist, wie wenn Sie einen reinterpret_cast von Foobar zu MyProtocol.