Verwenden von Objective-C-Klassen in Swift
Wenn Sie bereits eine Klasse haben, die Sie verwenden möchten, führen Sie Schritt 2 aus und fahren Sie dann mit Schritt 5 fort . (In einigen Fällen musste ich #import <Foundation/Foundation.h
einer älteren Objective-C-Datei eine explizite Datei hinzufügen .)
Schritt 1: Hinzufügen der Objective-C-Implementierung - .m
Fügen Sie .m
Ihrer Klasse eine Datei hinzu und benennen Sie sie CustomObject.m
.
Schritt 2: Bridging Header hinzufügen
Wenn Sie Ihre .m
Datei hinzufügen , wird wahrscheinlich eine Eingabeaufforderung angezeigt, die folgendermaßen aussieht:
Klicken Sie auf Ja !
Wenn Sie die Eingabeaufforderung nicht gesehen oder Ihren Bridging-Header versehentlich gelöscht haben, fügen Sie .h
Ihrem Projekt eine neue Datei hinzu und benennen Sie sie <#YourProjectName#>-Bridging-Header.h
.
In einigen Situationen, insbesondere wenn Sie mit Objective-C-Frameworks arbeiten, fügen Sie keine Objective-C-Klasse explizit hinzu, und Xcode kann den Linker nicht finden. Erstellen Sie in diesem Fall Ihre .h
Datei mit dem oben genannten Namen und stellen Sie dann sicher, dass Sie den Pfad in den Projekteinstellungen Ihres Ziels wie folgt verknüpfen:
Hinweis:
Es wird empfohlen, Ihr Projekt mithilfe des $(SRCROOT)
Makros zu verknüpfen , damit es weiterhin funktioniert, wenn Sie Ihr Projekt verschieben oder mit anderen über ein Remote-Repository daran arbeiten. $(SRCROOT)
kann als das Verzeichnis angesehen werden, das Ihre .xcodeproj-Datei enthält. Es könnte so aussehen:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Schritt 3: Fügen Sie den Objective-C-Header hinzu - .h
Fügen Sie eine weitere .h
Datei hinzu und benennen Sie sie CustomObject.h
.
Schritt 4: Erstellen Sie Ihre Objective-C-Klasse
Im CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
Im CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Schritt 5: Klasse zum Bridging-Header hinzufügen
In YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Schritt 6: Verwenden Sie Ihr Objekt
In SomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Es ist nicht erforderlich, explizit zu importieren. Dafür ist der Bridging-Header gedacht.
Verwenden von Swift-Klassen in Objective-C
Schritt 1: Neue Swift-Klasse erstellen
Fügen Sie .swift
Ihrem Projekt eine Datei hinzu und benennen Sie sie MySwiftObject.swift
.
In MySwiftObject.swift
:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Some Initializer Val" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "You sent me \(someArg)"
}
}
Schritt 2: Importieren Sie Swift-Dateien in die ObjC-Klasse
In SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
Die Datei: <#YourProjectName#>-Swift.h
sollte bereits automatisch in Ihrem Projekt erstellt werden, 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 = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
Anmerkungen:
Wenn sich die Code-Vervollständigung nicht wie erwartet verhält, führen Sie einen schnellen Build mit aus ⌘⇧R, damit Xcode einen Teil des Objective-C-Codes aus einem Swift-Kontext findet und umgekehrt.
Wenn Sie .swift
einem älteren Projekt eine Datei hinzufügen und die Fehlermeldung erhalten dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, starten Sie Xcode vollständig neu .
Während es ursprünglich möglich war, reine Swift-Klassen (keine Nachkommen von NSObject
) zu verwenden, die für Objective-C unter Verwendung des @objc
Präfixes sichtbar sind , ist dies nicht mehr möglich. Um in Objective-C sichtbar zu sein, muss das Swift-Objekt entweder eine Klasse sein, die der Konformität entspricht NSObjectProtocol
(der einfachste Weg, dies zu tun, besteht darin, von dieser zu erben NSObject
), oder eine enum
Markierung @objc
mit einem Rohwert eines ganzzahligen Typs wie Int
. Sie können den Bearbeitungsverlauf für ein Beispiel für Swift 1.x-Code @objc
ohne diese Einschränkungen anzeigen .