Ich versuche, mehrere Erweiterungen für UIButton
zu erstellen, so dass ich einfach durch Hinzufügen eines Protokolls zu einer benutzerdefinierten Schaltfläche einige Funktionen hinzufügen kann. Es wäre viel einfacher, wenn ich nicht einige Methoden in UIButton
überschreiben müsste, also denke ich, dass ich eine Erweiterung für UIButton
selbst machen muss.Extension UIButton nur wenn ich einem Protokoll zustimme
Zum Beispiel habe ich mehrere Protokolle meine-Buttons entsprechen können:
protocol CustomLayer { }
protocol ButtonSound { }
Bisher habe ich nur geschafft, eine Erweiterung für UIButton
ohne Einschränkungen zu erstellen (diese sind vereinfachte Versionen):
// Only when the button conforms to protocol CustomLayer
extension UIButton {
override public class func layerClass() -> AnyClass { return CAShapeLayer.self }
}
// Only when the button conforms to protocol ButtonSound
extension UIButton {
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesBegan(touches, withEvent: event)
AudioServicesPlaySystemSound(1104)
}
}
ich lese Beiträge habe ich eine Erweiterung für das Protokoll selbst mit einer für die Klasse, in der Klausel mache UIButton
:
extension CustomLayer where Self: UIButton { }
Aber dann kann ich keine Methoden von UIButton
selbst überschreiben.
Andere Vorschläge wie Subklassifizieren funktioniert, aber bestimmte Tasten können die gleiche Funktionalität nicht haben:
class A: CustomLayer { } // Can't have ButtonSound, single subclass works
class B: ButtonSound { } // Can't have CustomLayer, single subclass works
class C: CustomLayer, ButtonSound { } // Error: multiple inheritance from classes
Sie keinen Zwang zu einer Erweiterung hinzufügen können, wie sie auf das Potential für Mehrfachvererbung führen würde – Paulw11
Sie können nicht einfach Protokollkonformität zu "button" hinzufügen, Sie fügen es zu einer Unterklasse "UIButton" hinzu. Also machen Sie einfach Erweiterungen dieser Unterklassen. –
@ Paulw11: Ich hatte Angst davor, bemerkte ich beim Erstellen dieser Frage in einigen Fällen hatte ich mehrere Erbschaften. Ich werde die Frage ein wenig offen lassen, vielleicht könnten andere Vorschläge auftauchen. Danke für die Antwort. –