Ich habe einige Beiträge durchsucht, ich glaube, ich kann unter swift keine Erweiterung schreiben und sie aus Objective-C-Code aufrufen, oder?
@objc wie Attribute unterstützen nur Methoden, Klassen, Protokolle?
objective-c
swift
swift-extensions
Sprhawk
quelle
quelle
Antworten:
Sie können eine Swift-Erweiterung schreiben und in Objective-C-Code verwenden. Getestet mit XCode 6.1.1.
Alles was Sie tun müssen ist:
Erstellen Sie Ihre Erweiterung in Swift (keine
@objc
Anmerkung)#import "ProjectTarget-Swift.h"
in Ihrer Objective-C-Klasse (wobei "ProjectTarget" das XCode-Ziel darstellt, dem die Swift-Erweiterung zugeordnet ist)Rufen Sie die Methoden aus der Swift-Erweiterung auf
Update: Ab @Rizwan Ahmed müssen Sie eine
@objc
Anmerkung hinzufügen :quelle
Ich fand heraus, dass ich in Swift 4.0
@objc
vor meinem Erweiterungsschlüsselwort hinzufügen musste, damit die Swift-Erweiterungsmethoden für eine Instanz der von mir erweiterten Objc-Klasse sichtbar wurden.Zusamenfassend:
Setup der Dateikonfiguration:
In CustomClassExtension:
In meinem AppDelegate.m:
quelle
@nonobjc
Anmerkung hinzufügen .Diese Lösung funktioniert für Swift 2.2 und Swift 3 . Beachten Sie, dass von Objective-C nur auf Erweiterungen für Klassen (nicht für Strukturen oder Aufzählungen) zugegriffen werden kann.
Dann #import "ProductModuleName-Swift.h" in Ihre ObjC-Datei.
Swift 4
quelle
public
es nötig ist? Funktioniert gut ohnepublic
Modifikator für mich. Gehen wir davon aus, dass sich die Erweiterung nicht im selben Projekt befindet, sondern aus einem anderen Projekt importiert wird?Wie in den anderen Antworten beschrieben, funktioniert das Importieren des generierten Swift-Headers in den meisten Fällen .
Eine Ausnahme bildet, wenn die Kategorie für einen überbrückten Typ definiert ist (dh die Erweiterung ist für definiert
String
und nichtNSString
). Diese Kategorien werden nicht automatisch mit ihren Objective-C-Gegenstücken verknüpft. Um dies zu umgehen, müssen Sie entweder den Objective-C-Typ verwenden (und den Rückgabewert in Ihren Swift-Code umwandelnas String
) oder eine Erweiterung für den Swift- und den Objective-C-Typ definieren.quelle
public extension NSString
. Sollten Sie beim Kompilieren einen ungelösten Bezeichner oder einen ähnlichen Fehler erhalten, können Sie erneut auf String zurückgreifen, z. B.let sVal = self as String
den erforderlichen CodesVal
mclaughlinj
gesagt, sowohl für die NSString-Klasse als auch für die String-StrukturImportieren Sie den Header "#import" ProductModuleName-Swift.h " in die Objective-C-Datei und fügen Sie @objc vor Ihrer Erweiterung in die Swift-Datei ein. In Swift 4.2 und Swift 5 funktioniert dies einwandfrei
quelle