Wie kann ich in @ Swift 4 mit der @objc-Inferenzabwertung mit #selector () umgehen?
Ich versuche zu konvertieren, mein Projekt ist der source code von Swift 3 Swift 4. Eine Warnung, die Xcode ist was mich über meine Selektoren.
Habe ich zum Beispiel ein Ziel hinzuzufügen, um eine Schaltfläche mit einem normalen Selektor wie:
button.addTarget(self, action: #selector(self.myAction), for: .touchUpInside)
Dies ist die Warnung, es zeigt:
Argument '#selector' bezieht sich auf die Instanz-Methode " myAction()' in 'ViewController' hängt '@objc' Attribut Inferenz deprecated in Swift 4
Hinzufügen '@objc', um zu bewirken, dass diese Instanz-Methode in Objective-C
Nun, schlagen Fix
auf die Fehlermeldung bedeutet das für meine Funktion:
//before
func myAction() { /* ... */ }
//after
@objc func myAction() { /* ... */ }
Ich nicht wirklich wollen alle umbenennen zu meinen Funktionen gehören die @objc
mark und ich gehe davon aus, dass das nicht nötig ist.
Wie kann ich schreiben die Wähler befassen sich mit der Missbilligung?
Verwandte Frage:
InformationsquelleAutor der Frage LinusGeffarth | 2017-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den fix-es ist richtig – es gibt nichts über den selector können Sie ändern, um die Methode auf die es sich bezieht ausgesetzt Objective-C.
Der ganze Grund für diese Warnung ist in Erster Linie das Ergebnis von SE-0160. Vor Swift 4,
internal
oder höher Objective-C kompatibel MitgliederNSObject
Erben wurden die Klassen abgeleitet werden@objc
und deshalb ausgesetzt, Objective-C, es Ihnen so zu ermöglichen, genannt werden die Verwendung von Auswahlen, (wie die Obj-C runtime ist erforderlich, um die lookup-die Implementierung der Methode für einen bestimmten Selektor).Jedoch in der Swift 4 ist dies nicht mehr der Fall. Nur sehr spezifische Erklärungen sind nun gefolgert werden
@objc
zum Beispiel überschreibt der@objc
Methoden, Implementierungen von@objc
- Protokoll Anforderungen und Erklärungen, deren Attribute implizieren@objc
wie@IBOutlet
.Die motivation hinter diesem, als detaillierte in der oben verlinkten Vorschlagist zunächst zu verhindern Methode überlastungen in
NSObject
Erben von Klassen, die miteinander kollidieren, aufgrund der mit identischen Selektoren. Zweitens, es hilft bei der Reduzierung der binären Größe von nicht mit zu generieren thunks für Mitglieder, die nicht ausgesetzt werden müssen, um Obj-C, und drittens verbessert die Geschwindigkeit des dynamic linking.Wenn Sie möchten, dass ein Mitglied in Obj-C, die Sie benötigen, um Sie zu markieren, wie
@objc
zum Beispiel:(Migrations-sollte dies automatisch für Sie mit Selektoren verwenden, wenn mit der "minimieren Inferenz" - option ausgewählt)
Aussetzen einer Gruppe von Mitgliedern, die in Obj-C verwenden, können Sie eine
@objc extension
:Dadurch werden alle Mitglieder definiert, die in Obj-C, und geben Sie einen Fehler auf alle Mitglieder, die nicht ausgesetzt werden, um Obj-C (sofern nicht ausdrücklich gekennzeichnet ist, wie
@nonobjc
).Wenn Sie eine Klasse haben wo Sie Sie brauchen alle Obj-C kompatibel Mitglieder ausgesetzt, Obj-C, Sie können markieren Sie die Klasse als
@objcMembers
:Nun, alle Mitglieder, die abgeleitet werden kann, werden
@objc
werden. Allerdings würde ich nicht raten, dies zu tun, es sei denn, Sie wirklich müssen alle Mitglieder ausgesetzt, Obj-C, gegeben die oben erwähnten Nachteile des habens Mitglieder unnötig ausgesetzt.InformationsquelleAutor der Antwort Hamish
Als Apple-Offizielle Dokumentation. Sie müssen mit @objc Ihren Anruf Selector-Methode.
InformationsquelleAutor der Antwort Kiran Sarvaiya