iOS
Schnelle und Objective-C-Interoperabilität
Suche…
Verwenden von Objective-C-Klassen in Swift
Wenn Sie über eine vorhandene Klasse verfügen, 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 einer älteren ObjC-Datei explizit
#import <Foundation/Foundation.h
hinzufügen.)
Schritt 1: Fügen Sie die Objective-C-Implementierung hinzu
Fügen .m
Ihrer Klasse eine .m
Datei hinzu, und nennen Sie sie CustomObject.m
Schritt 2: Fügen Sie den Bridging-Header hinzu
Wenn Sie Ihre .m
Datei hinzufügen, werden Sie wahrscheinlich mit einer Eingabeaufforderung getroffen, die wie .m
aussieht:
Klicken Sie auf JA !
Wenn die Aufforderung nicht angezeigt oder der Bridging-Header versehentlich gelöscht wurde, fügen .h
Ihrem Projekt eine neue .h
Datei hinzu, und nennen Sie sie <#YourProjectName#>-Bridging-Header.h
In einigen Situationen, insbesondere bei der Arbeit mit ObjC-Frameworks, fügen Sie eine Objective-C-Klasse nicht explizit hinzu, und Xcode kann den Linker nicht finden. In diesem Fall erstellen Sie Ihre .h
Datei mit dem oben genannten Namen und stellen Sie sicher, dass Sie den Pfad in den Projekteinstellungen Ihres Ziels wie folgt verknüpfen:
Hinweis
Es ist $(SRCROOT)
Ihr Projekt mit dem $(SRCROOT)
zu verknüpfen. Wenn Sie Ihr Projekt verschieben oder mit anderen über ein Remote-Repo daran arbeiten, funktioniert es trotzdem. $(SRCROOT)
kann als das Verzeichnis betrachtet werden, das Ihre .xcodeproj-Datei enthält. Es könnte so aussehen:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Schritt 3: Objective-C Header hinzufügen - .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 <Foundation/Foundation.h>
@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: 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 = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Es ist nicht notwendig, explizit zu importieren, dafür ist der Bridging-Header gedacht.
Verwendung schneller Klassen in Objective-C
Schritt 1: Neue Swift-Klasse erstellen
Fügen .swift
Ihrem Projekt eine .swift
Datei hinzu und nennen Sie sie MySwiftObject.swift
In MySwiftObject.swift
:
import Foundation
class MySwiftObject : NSObject {
var someProperty: AnyObject = "Some Initializer Val"
init() {}
func someFunction(someArg:AnyObject) -> String {
var returnVal = "You sent me \(someArg)"
return returnVal
}
}
Schritt 2: Importieren Sie Swift-Dateien in die ObjC-Klasse
In SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
Die Datei: <#YourProjectName#>-Swift.h
sollte bereits in Ihrem Projekt automatisch 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 someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);
Hinweis:
1. CodeCompletion verhielt sich nicht so genau, wie ich es gerne hätte. Auf meinem System schien ein schneller Build mit "cmd + r" dem Swift dabei zu helfen, einen Teil des Objc-Codes zu finden und umgekehrt.
2. Wenn Sie einem älteren Projekt eine .swift
Datei hinzufügen und eine Fehlermeldung erhalten: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, starten Sie Xcode vollständig neu.
3. Während ursprünglich reine Swift-Klassen in Objective-C mit dem @objc
Präfix verwendet werden konnten, ist dies nach Swift 2.0 nicht mehr möglich. Die ursprüngliche Erklärung finden Sie unter Bearbeitungshistorie. Wenn diese Funktion in zukünftigen Swift-Versionen wieder aktiviert wird, wird die Antwort entsprechend aktualisiert.