In Swift sehe ich einige Methoden wie:
@objc private func doubleTapGestureRecognized(recognizer: UITapGestureRecognizer)
Ich habe mich gefragt, wann ich @objc verwenden soll. Ich habe einige Dokumente gelesen, aber sie sagen, wenn Sie möchten, dass es in Objective-C aufgerufen werden kann, sollten Sie das Flag @objc hinzufügen
Dies ist jedoch eine private Funktion in Swift. Was macht der @obj?
Antworten:
privat bedeutet es nur in Swift sichtbar. Verwenden Sie also @objc, um in Objective-C sichtbar zu werden. Wenn Sie eine Funktion zum schnellen Auswählen einer privaten Funktion haben, ist diese erforderlich.
Siehe: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html
quelle
@objc private func doubleTapGestureRecognized
, was ist der Punkt sowohl @objc und privat zu haben? Wollen Sie damit sagen, dass Objective-C-Klassen doubleTapGestureRecognized überschreiben können?Eine weitere späte Antwort, aber keine der vorhandenen Antworten auf diese Frage beantwortet wirklich die Frage des OP: Warum zum Teufel müssten Sie
@objc
einprivate
Klassenmitglied verwenden, wenn@objc
es für die Interaktion mit Objective-C und dem betreffenden Mitglied vorhanden ist? ist privat, was bedeutet, dass selbst wenn Sie Objective-C-Code in Ihrem Projekt haben, es das Mitglied sowieso nicht sehen kann?Der Grund dafür ist, dass, da viele der Frameworks in Objective-C geschrieben sind, manchmal Objective-C-Funktionen erforderlich sind, um mit bestimmten APIs zu interagieren.
Angenommen, ich möchte mich für eine Benachrichtigung registrieren über
DistributedNotificationCenter
:Damit dies funktioniert, müssen wir in der Lage sein, den Selektor für die
somethingHappened
Methode zu erhalten. Selektoren sind jedoch ein Objective-C-Konzept. Wenn die Methode für Objective-C nicht sichtbar ist, verfügt sie nicht über einen Selektor. Daher kann , selbst wenn die Methode privat ist und nicht durch willkürlichen außerhalb Code aufgerufen werden soll, wird es eine müssen ,@objc
um für denDistributedNotification
Code, der in Objective-C geschrieben ist, nennt es über seine Wähler zu können.Ein weiterer häufiger Fall, der
@objc
benötigt wird, ist die Unterstützung der Schlüsselwertcodierung (KVC), insbesondere unter macOS, wo KVC und KVO zur Implementierung von Kakaobindungen verwendet werden. KVC wird wie viele andere Systeme in Cocoa in Objective-C implementiert, wodurch KVC-kompatible Eigenschaften für die Objective-C-Laufzeit verfügbar gemacht werden müssen. Manchmal ist es sinnvoll, dass KVC-konforme Eigenschaften privat sind. Ein Beispiel ist, wenn Sie eine Eigenschaft haben, die andere Eigenschaften beeinflusst:In diesem Fall ist unsere tatsächlich gespeicherten Eigenschaft privat, aber die abhängige Eigenschaft, die wir tun , um außerhalb Code aufzudecken, muss seine Benachrichtigungen senden , wenn das Privateigentum aktualisiert. Durch Markieren der Privateigenschaft als
@objc
können wir dies leicht tun, indem wir eine KVC-Abhängigkeit einrichten. Andernfalls müssten wir Code schreiben, um die Benachrichtigungen in den PrivateigentumernwillSet
unddidSet
Handlern manuell zu senden . Darüber hinaus muss die statische Eigenschaft, die das vondependentProperty
abhängige KVC-System informiertoriginalProperty
, für Objective-C verfügbar gemacht werden, damit das KVC-System es finden und aufrufen kann. Für Kunden unseres Codes ist es jedoch nicht relevant.Außerdem kann ein Ansichtscontroller in einer macOS-App, der Steuerelemente in seiner Ansicht mithilfe von Cocoa Bindings als Implementierungsdetail aktualisiert, bestimmte private Eigenschaften KVC-kompatibel machen, um diese Steuerelemente an sie zu binden.
Wie Sie sehen, kann es vorkommen, dass eine Methode oder Eigenschaft für Objective-C verfügbar gemacht werden muss, um mit den Frameworks zu interagieren, ohne dass dies für Clients Ihres Codes unbedingt sichtbar sein muss.
quelle
@objc / dynamic
Dies dient der Kompatibilität: Sobald Sie Ihre Swift-Datei / Ihren Swift-Code in ein Objective-C-basiertes Projekt importiert haben.
Verwenden Sie diese Option, wenn auf Ihre Eigenschaft / Methode über Objective-C-Code oder -Klasse zugegriffen werden soll.
Meistens passiert dies, wenn Sie eine Swift-Klasse der Objective-C-Basisklasse unterklassifizieren.
Hier Apple-Dokumentation, die über sagt
@objc
.Verwenden von Swift aus Objective-C
Kompatibilität der Sprachinteroperabilität
Links aktualisiert:
Anscheinend wurden die Links von Apple aktualisiert.
quelle
@objc ist ein Klassenattribut, das Sie verwenden
Die Methoden der Klasse werden für Objective C-Klassen verfügbar gemacht, sodass Sie sie nur verwenden, wenn Ihre Klasse öffentliche Funktionen enthält
quelle
Eine späte Antwort, aber dieses
@objc
Verhalten ändert sich ab Swift 4 (das in Xcode 9 veröffentlicht wurde, das vor 10 Tagen veröffentlicht wurde) geringfügig.In Swift 4 werden einige Inferenzfälle von
@objc
entfernt. Dies bedeutet nur in einigen zusätzlichen Fällen, dass der@objc
Header in Swift 4 nicht abgeleitet wurde, bevor er vom Swift-Compiler abgeleitet wurde.Lesen Sie mehr im Swift Evolution-Vorschlag zu dieser Änderung
Wie bereits erwähnt, besteht im Allgemeinen
@objc
darin, bestimmte Methoden der Objective-C-Laufzeit auszusetzen, die Teil der Swift-Interoperabilität der Sprache ist.quelle
@objc
@objc
setzt eine Erklärung ausObjective-C runtime
. Schauen wir uns die#selector
Funktion von Swift an, um eine Objective-C-Laufzeit zu verwenden. In diesem Fall können Sie Ihren Swift definieren@objc private func
[Mehr]So verwenden Sie Swifts Funktionen aus Objective-C:
NSObject
Mark Swifts:
ein. Nur
@objcMembers
Klasse - um allepublic
Konstruktoren , Felder und Methoden verfügbar zu machen . Es gilt auch für Unterklassenb.
@objc
Klasse / Aufzählung / Protokoll (außer Struktur ) [Benannter Typ]@objc
Klasse (optional) - um einen Standard verfügbar zu machenpublic init()
. Oder@objc(<custom_name>)
um einen benutzerdefinierten Namen für die Klasse einzurichten.@objc
Konstruktoren , Felder und Methoden - um sie selektiv verfügbar zu machenSwifts Methode wird bei der nächsten Benennung verfügbar sein:
Beispielsweise:
[
@objc
unddynamic
]quelle