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:

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein

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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow