1138 Stimmen

Wie rufe ich Objective-C-Code aus Swift auf?

In Swift, wie ruft man Objective-C-Code auf?

Apple erwähnte, dass sie in einer Anwendung nebeneinander existieren könnten, aber bedeutet das, dass man technisch gesehen alte Klassen, die in Objective-C erstellt wurden, wiederverwenden könnte, während man neue Klassen in Swift erstellt?

1562voto

Logan Punkte 50618

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:

Ein macOS-Blatt-Stil-Dialog aus Xcode, der fragt, ob Sie einen Objective-C-Bridging-Header konfigurieren möchten

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:

Eine Animation, die den obigen Absatz veranschaulicht

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:

  1. 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.

  2. 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.

  3. 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.

``

132voto

rickster Punkte 121640

Sehen Sie sich das Handbuch von Apple zur Verwendung von Swift mit Cocoa und Objective-C an. Dieses Handbuch behandelt, wie man Objektive-C- und C-Code von Swift verwenden kann und vice versa, und bietet Empfehlungen dazu, wie man ein Projekt konvertiert oder Objektive-C/C- und Swift-Teile in einem bestehenden Projekt kombiniert.

Der Compiler generiert automatisch Swift-Syntax zum Aufrufen von C-Funktionen und Objective-C-Methoden. Wie in der Dokumentation zu sehen ist, wird dieses Objective-C:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

in folgenden Swift-Code umgewandelt:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

Xcode führt diese Übersetzung auch im Handumdrehen durch - Sie können während Sie eine Swift-Datei bearbeiten Open Quickly verwenden und den Namen einer Objektive-C-Klasse eingeben, und es bringt Sie zu einer Swift-Version des Klassenheaders. (Sie können dies auch erreichen, indem Sie auf ein API-Symbol in einer Swift-Datei mit cmd-klicken.) Und alle API-Referenzdokumentationen in den iOS 8 und OS X v10.10 (Yosemite) Entwicklerbibliotheken sind sowohl in Objektive-C- als auch in Swift-Form sichtbar (z.B. UIView).

70voto

derrrick Punkte 721

Hier sind Schritt-für-Schritt-Anleitungen zur Verwendung von Objective-C-Code (in diesem Fall ein von einem Drittanbieter bereitgestelltes Framework) in einem Swift-Projekt:

  1. Fügen Sie eine beliebige Objective-C-Datei zu Ihrem Swift-Projekt hinzu, indem Sie Datei -> Neu -> Neue Datei -> Objective-C-Datei auswählen. Beim Speichern wird Xcode fragen, ob Sie einen Bridging Header hinzufügen möchten. Wählen Sie 'Ja'. Gif: Leere Datei zum Projekt hinzufügen und Bridging Header generieren
    (Quelle: <a href="http://www.derrrick.com/stackoverflow/1-empty-file.gif" rel="noreferrer">derrrick.com</a>)

In einfachen Schritten:

  1. Ein Dialogfeld erscheint, und dann klicken Sie auf OK... Wenn es nicht erscheint, erstellen wir es manuell wie im folgenden... Erstellen Sie eine Headerdatei aus iOS-Quellen und geben Sie den Namen ProjectName-Bridging-Header (Beispiel: Test-Bridging-Header) und gehen Sie dann zu Bauen Einstellung im Swift-Compilercode -> Objective-C-Bridge fügen Sie den Namen der Objective-C-Bridge hinzu..(Test/Test-Bridging-Header.h). Ja, das ist fertig.

  2. Optional können Sie die hinzugefügte Objective-C-Datei löschen (benannt "anything" im obigen GIF-Bild). Sie benötigen sie nicht mehr.

  3. Öffnen Sie die Bridging-Header-Datei -- der Dateiname hat die Form [IhrProjekt]-Bridging-Header.h. Es enthält einen von Xcode bereitgestellten Kommentar. Fügen Sie eine Zeile Code für die zu inkludierende Objective-C-Datei hinzu, wie z.B. ein Framework von einem Drittanbieter. Um beispielsweise Mixpanel zu Ihrem Projekt hinzuzufügen, müssen Sie die folgende Codezeile zur Bridging-Header-Datei hinzufügen:

    #import "Mixpanel.h"
  4. Jetzt können Sie in beliebiger Swift-Datei existierenden Objective-C-Code im Swift-Syntax verwenden (im Fall dieses Beispiels, und Sie können Methoden des Mixpanel-SDK aufrufen, usw.). Sie müssen sich damit vertraut machen, wie Xcode Objective-C in Swift übersetzt. Apples Anleitung ist eine schnelle Lektüre. Oder sehen Sie sich diese Antwort für eine unvollständige Zusammenfassung an.

Beispiel für Mixpanel:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("Ihr-Token")
    return true
}

Das war's!

Hinweis: Wenn Sie die Bridging-Header-Datei aus Ihrem Projekt entfernen, stellen Sie sicher, dass Sie in den Build-Einstellungen den Wert für "Objective-C-Bridging-Header" unter "Swift Compiler - Code Generation" entfernen.

45voto

Jake Lin Punkte 10558

Sie können den schönen Beitrag Swift & Cocoapods lesen. Im Grunde müssen wir eine Bridging-Header-Datei erstellen und alle Objective-C-Header dort platzieren. Anschließend müssen wir diese in den Build-Einstellungen referenzieren. Danach können wir den Objective-C-Code verwenden.

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

Schauen Sie sich auch das Dokument von Apple Using Swift with Cocoa and Objective-C an.

30voto

Gian Luigi Romita Punkte 1121

Ich habe ein einfaches Xcode 6-Projekt erstellt, das zeigt, wie man C++, Objective-C und Swift-Code mischen kann:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

Insbesondere ruft das Beispiel eine Objective-C- und eine C++-Funktion aus dem Swift auf.

Der Schlüssel ist es, einen gemeinsamen Header, Project-Bridging-Header.h, zu erstellen und die Objective-C-Header dort zu platzieren.

Bitte laden Sie das Projekt als vollständiges Beispiel herunter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X