Ich habe ein altes Objective-C-Projekt und möchte eine neue Swift-Funktion und ein neues Swift-Objekt aufrufen. Ich habe die Dateien " <ProjectName>-Bridging-Header.h
" und " <ProjectName>-Swift.h
" erstellt.
Es war einfach für mich, die Funktion von Swift nach Objective-C aufzurufen, aber ich habe ein Problem mit der Umkehrung.
Also habe ich eine einfache Klasse "System.Swift" erstellt
import Foundation
@objc class System : NSObject {
@objc func printSome() {
println("Print line System");
}
}
Jetzt habe ich versucht, der Dokumentation hier zu folgen und in der <...>-Swift.h
Datei habe ich dies geschrieben
@class System;
@interface System : NSObject
-(void)printSome;
@end
und ich habe es in meine Objective-C-Klasse importiert. An diesem Punkt in meiner Objective C-Klasse (derzeit UIViewController) meines Objective-C-Codes habe ich versucht, die "printSome" -Methode aufzurufen:
- (void)viewDidLoad
{
[super viewDidLoad];
System * sis = [[System alloc] init];
[sis printSome];
//any additional setup after loading the view from its nib.
}
Jetzt habe ich folgenden Fehler:
Undefinierte Symbole für Architektur i386: " OBJC_CLASS $ _System", referenziert von: objc-class-ref in "ObjectiveC_Class_That_Call_Swift_Object" -v um Aufruf zu sehen)
quelle
Antworten:
Problem behoben, ich habe zuvor eine neue
.h
Datei mit dem Namen " Objective-C" erstellt und in meine Objective-C- Klasse aufgenommen<ProductModuleName>-Swift.h
. Wie ich später feststellte, ist dieser Schritt nicht erforderlich, da der Compiler die erforderliche Datei unsichtbar erstellt.Einfach
<ProductModuleName>-Swift.h
in deine Klasse aufnehmen und es sollte funktionieren.quelle
@objc
Präfix. Das-Swift.h
wurde automatisch erstellt. Das, was mir Kopfschmerzen bereitet, ist, dass ich die Klasse selbst aufrufen kann, aber keine Funktion darin. Weiß jemand warum?<productModuleName>-.Swift.h
(nichtmodel
).#import "My_Project-Swift.h"
.Es ist seltsam, aber es wird funktionieren
Die App generiert die Schnittstelle für diese Klasse in -Swift.h
Beispiel: SWIFT_CLASS ("_ TtC10Project17220PLHelper") @interface PLHelper
quelle
@objc (MyClassName)
(ProjectName)-Swift.h
, NICHT(ClassName)-Swift.h
!3) @class SwiftClassName;
hat mich gerettetAngenommen, wir haben den Projektnamen "MyFirstProjectOnSwift" und den schnellen Klassennamen "mySwiftClass". Die ObjectiveC-Klasse lautet "MyObjectiveCLass".
Folgende Schritte sind: -
quelle
Überprüfen Sie die Datei -Swift.h, die den Import in Ihre .m-Datei in Ziel-C enthält:
Klicken Sie auf diese Zeile und klicken Sie mit der linken Maustaste - Zur Definition springen.
Diese Datei sollte automatisch und nicht manuell aufgenommen werden.
quelle
Wenn Sie Ihre Klasse auch nach dem Importieren immer noch nicht sehen
<ProductModuleName>-Swift.h
.Stellen Sie sicher, dass Ihre Klasse eine native Klasse (z. B.
UIViewController
) unterklassifiziert, oder machen Sie sie zumindest zu einer Unterklasse, wenn es sich nur um eine Utility-Klasse handeltNSObject
. Ihre Klasse sollte jetzt zeigen.quelle
Kleiner zusätzlicher Tipp für alle, die über diesen Beitrag stolpern und für die die anderen Antworten nicht funktionieren: Möglicherweise müssen Sie Ihre Swift-Klasse auch als "öffentlich" deklarieren.
Beispiel:
@objc public class MySwiftClass: NSObject {
quelle
Die empfohlene Methode zum Ausführen von Swift-Code von Objective-C in Projekten, die von Obj-C nach Swift migriert werden, ist die Verwendung des Bridge / Proxy-Musters.
import Foundation
@objc class AnalyticsPropertyBridge: NSObject {
}
#import "CallerModule.h"
3.a Umbrella-Datei importieren:
#import "MyProject-Swift.h"
3.b Rufen Sie die Brücke an.
[[AnalyticsPropertyBridge new] refreshProperties];
Vorteile: Ihr schneller Code wird mit @objc nicht schmutzig, da Code von Objc aufgerufen wird. Mit der Zeit wird der ObjC in Ihrem Projekt reduziert und schließlich wird die Braut entfernt.
quelle
Ein guter Artikel hier draußen, wenn jemand noch Probleme hat.
Einrichten der schnellen und Objective-C-Interoperabilität
quelle