Ich bin ein Swift-Projekt erstellen, und ich möchte ein bestimmtes Protokoll definieren, die anderen Komponenten erzwingt eine animate
Methode zu implementieren:Was wäre eine bessere Strategie für IBActions in Swift-Protokollen?
protocol AnimatableBehavior {
@IBAction func animate()
}
Das Problem ist, möchte ich diese Methode ein IBAction
sein, aber ich habe diesen Fehler von XCode:
Nur Instanzmethoden deklariert
Meine Frage 'IBAction' werden soll, wie woul Solltest du so etwas umsetzen?
Ich habe in Betracht gezogen:
@IBAction
entfernen, aber dann muss ich erinnere mich, es in jeder Klasse hinzufügen, die implementiert. Nicht sehr elegant und fehleranfällig.- Erstellen Sie eine Basisklasse anstelle von Protokoll, aber dann erzwinge ich alle Komponenten zu Unterklasse meiner Basisklasse statt ihrer eigenen, also ist es keine gültige Option.
Irgendwelche anderen Ideen?
EDIT: Antwort auf Kommentare unten.
Die Idee des IBAction
auf dem Protokoll ist, weil im Projekt wird es viele verschiedene Entwickler geben, die kleine UI-Komponenten implementieren, von denen alle die animierte Methode haben. Die Komponenten können programmatisch oder von Interface Builder hinzugefügt werden und es ist sehr praktisch, dass sie immer IBAction
sind, weil ich plane, sie aus IB-Dateien zu zu kompilieren, um die View Controller im maximalen Umfang zu vereinfachen (und dies ist eindeutig nur View Aufgabe).
Daher ist die unten vorgeschlagene Lösung des Hinzufügens einer Methode in der Steuerung, die animate
der Komponente aufruft, nicht gut, weil es redundanter Code ist und Ihren Controller abhängiger von Ihrer Ansicht macht.
Die Idee, den Entwickler das Hinzufügen des IBAction
Schlüsselwortes auf der Methode zu lassen, ist praktikabel, aber wie gesagt, es ist fehleranfällig (und damit meine ich, dass es einige vergessen wird), und ich will es stellen Sie sicher, dass dies immer von IB aus zugänglich ist. Es fügt auch zusätzliche kognitive Belastung hinzu, weil ich diesen Mangel an IBAction
auf dem Protokoll dokumentieren muss und den Implementierer auffordern muss, es manuell hinzuzufügen.
Ich weiß, ist nicht die übliche Art der Arbeit in iOS und UIKit
, aber das war der Grund, warum ich die Frage gestellt, vielleicht hat jemand eine alternative Idee.
Ich glaube nicht, dass es eine andere Lösung dafür gibt. Vielleicht schau dir das große Bild an, was versuchst du damit zu erreichen? – Rengers
Ich sehe nicht, wie die tatsächlichen Implementierer feststellen können, ob "animate()" eine '@ IBAction' ist oder nicht. Bitte lesen Sie meine Antwort und lassen Sie mich wissen, wenn Sie Fragen haben. Ich denke, das kann ein XY-Problem sein, aber eine Methode in einem Protokoll zu machen, kann unmöglich einen Sinn ergeben, wenn Sie wirklich verstehen, was '@ IBAction' ist und tut. – nhgrif
Ich habe Ihren Kommentar gelesen und ich verstehe, was 'IBAction' tut, aber es macht immer noch Sinn. Sehen Sie meine Bearbeitung :) –