Verwendung von Objective-C-Klassen in Swift
Wenn Sie eine vorhandene Klasse verwenden möchten, führen Sie Schritt 2 aus und überspringen Sie dann Schritt 5. (In einigen Fällen musste ich einer älteren Objective-C-Datei ein explizites #import hinzufügen.)
``
Schritt 1: Fügen Sie die Objective-C-Implementierung hinzu -- .m
Fügen Sie Ihrer Klasse eine .m
Datei hinzu und nennen Sie sie CustomObject.m
.
Schritt 2: Fügen Sie das Bridging-Header hinzu
Beim Hinzufügen Ihrer .m
Datei werden Sie wahrscheinlich mit einem Dialogfeld konfrontiert, das so aussieht:
Klicken Sie auf Ja!
Wenn Sie die Aufforderung nicht gesehen haben oder versehentlich Ihren Bridging-Header gelöscht haben, fügen Sie eine neue .h
Datei zu Ihrem Projekt hinzu und nennen Sie sie <#IhrProjektname#>-Bridging-Header.h
.
In einigen Situationen, insbesondere bei der Arbeit mit Objective-C-Frameworks, fügen Sie keine Objective-C-Klasse explizit hinzu und Xcode kann den Linker nicht finden. In diesem Fall erstellen Sie Ihre .h
Datei wie oben erwähnt, stellen dann sicher, dass Sie den Pfad in den Projekteinstellungen Ihres Ziels verknüpfen, wie folgt:
Hinweis:
Es ist bewährte Praxis, Ihr Projekt mit dem $(SRCROOT)
Makro zu verknüpfen, damit es auch dann funktioniert, wenn Sie Ihr Projekt verschieben oder mit anderen über ein Remote-Repository arbeiten. $(SRCROOT)
kann als das Verzeichnis betrachtet werden, das Ihre .xcodeproj-Datei enthält. Es könnte so aussehen:
$(SRCROOT)/Folder/Folder/<#IhrProjektname#>-Bridging-Header.h
Schritt 3: Fügen Sie den Objective-C-Header hinzu -- .h
Fügen Sie eine weitere .h
Datei hinzu und nennen Sie sie CustomObject.h
.
Schritt 4: Erstellen Sie Ihre Objective-C-Klasse
In CustomObject.h
#import
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
In CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Schritt 5: Fügen Sie die Klasse zum Bridging-Header hinzu
In YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Schritt 6: Verwenden Sie Ihr Objekt
In SomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hallo Welt"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Es ist nicht erforderlich, es explizit zu importieren; dafür ist der Bridging-Header da.
Verwendung von Swift-Klassen in Objective-C
Schritt 1: Erstellen Sie eine neue Swift-Klasse
Fügen Sie Ihrem Projekt eine .swift
Datei hinzu und nennen Sie sie MySwiftObject.swift
.
In MySwiftObject.swift
:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Einige Initialisierungs-Wert" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "Du hast mir \(someArg) geschickt"
}
}
Schritt 2: Importieren Sie Swift-Dateien in die ObjC-Klasse
In SomeRandomClass.m
:
#import "<#IhrProjektname#>-Swift.h"
Die Datei <#IhrProjektname#>-Swift.h
sollte automatisch in Ihrem Projekt erstellt worden sein, auch wenn Sie sie nicht sehen können.
Schritt 3: Verwenden Sie Ihre Klasse
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hallo Welt";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
Notizen:
-
Wenn die Code-Vervollständigung nicht wie erwartet funktioniert, versuchen Sie einen schnellen Build mit R, um Xcode dabei zu helfen, einige der Objective-C-Code aus einem Swift-Kontext und umgekehrt zu finden.
-
Wenn Sie zu einem älteren Projekt eine .swift
Datei hinzufügen und den Fehler dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
erhalten, versuchen Sie, Xcode komplett neu zu starten.
-
Es war ursprünglich möglich, reine Swift-Klassen (keine Nachkommen von NSObject
), die für Objective-C sichtbar sind, durch Verwendung des Präfix @objc
zu verwenden, dies ist jedoch nicht mehr möglich. Um in Objective-C sichtbar zu sein, muss das Swift-Objekt entweder eine Klasse sein, die das NSObjectProtocol
erfüllt (der einfachste Weg dazu ist, von NSObject
zu erben) oder ein enum
, das mit einem Rohwert eines ganzzahligen Typs wie Int
markiert ist. Sie können die Änderungshistorie für ein Beispiel von Swift 1.x-Code anzeigen, der @objc
ohne diese Einschränkungen verwendet.
``