Frage So rufen Sie Objective-C-Code von Swift auf


Wie nennt man in der neuen Swift-Sprache von Apple Objective-C-Code?

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

Die Begründung

Objective-C ist eine plattformunabhängige Sprache, während Swift plattformabhängig ist. Das Schreiben von nicht plattformabhängigem Code (Business Logic Libraries) in Swift wäre daher nicht sinnvoll. Es wäre jedoch vollkommen in Ordnung, plattformabhängigen Code darin zu schreiben (zum Beispiel in Bezug auf die Schnittstelle). Nicht zu sagen, es wäre eine gute Idee, aber es ist definitiv ein Interesse.


818
2018-06-02 20:05


Ursprung


Antworten:


 Verwenden von Objective-C-Klassen in Swift

** Wenn Sie eine vorhandene Klasse haben, die Sie verwenden möchten, führen Sie sie aus Schritt 2 und dann zu Schritt 5. (In einigen Fällen musste ich eine explizite hinzufügen #import <Foundation/Foundation.h zu einer älteren Objective-C-Datei.) **

 Schritt 1: Hinzufügen der Objective-C-Implementierung - .m

Füge hinzu ein .m Datei in Ihre Klasse und benennen Sie sie CustomObject.m.

 Schritt 2: Überbrückungskopf hinzufügen

Beim Hinzufügen von .m Datei, Sie werden wahrscheinlich mit einer Eingabeaufforderung getroffen, die wie folgt aussieht:

Enter image description here

Klicken  JA !

Wenn die Eingabeaufforderung nicht angezeigt wurde oder Sie versehentlich Ihren Überbrückungsheader gelöscht haben, fügen Sie einen neuen hinzu .h Datei zu Ihrem Projekt und benennen Sie es <#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. In diesem Fall erstellen Sie Ihre .h Datei wie oben erwähnt, dann stellen Sie sicher, dass Sie den Pfad in den Projekteinstellungen Ihres Ziels wie folgt verknüpfen:

Enter image description here

Hinweis

Es ist die beste Vorgehensweise, Ihr Projekt mithilfe des $(SRCROOT) Makro, so dass, wenn Sie Ihr Projekt verschieben oder mit anderen über ein Remote-Repository daran arbeiten, es trotzdem funktioniert. $(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

Neue hinzufügen .h Datei und benennen Sie es 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 zu Bridging-Header hinzufügen

Im YourProject-Bridging-Header.h:

#import "CustomObject.h"

 Schritt 6: Verwenden Sie Ihr Objekt

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

 Swift-Klassen in Objective-C verwenden

 Schritt 1: Erstellen Sie eine neue Swift-Klasse

Füge hinzu ein .swift Datei zu Ihrem Projekt und benennen Sie es MySwiftObject.swift.

Im 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

Im SomeRandomClass.m:

#import "<#YourProjectName#>-Swift.h"

Die Datei:<#YourProjectName#>-Swift.h sollte in Ihrem Projekt bereits automatisch erstellt werden, auch wenn Sie es 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 verhält sich nicht so genau, wie ich es möchte. Auf meinem System schien es Swift zu helfen, einen Teil des Objective-C-Codes zu finden und umgekehrt, um einen schnellen Build mit "cmd + r" auszuführen.

2. Wenn Sie ein hinzufügen .swift Datei zu einem älteren Projekt und Fehler erhalten: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib, versuch es komplett Xcode neu starten.

3. Während es ursprünglich möglich war, reine Swift-Klassen in Objective-C zu verwenden, nutzte man die @objc Präfix, nach Swift 2.0 ist dies nicht mehr möglich. Siehe Bearbeitungsverlauf für die ursprüngliche Erklärung. Wenn diese Funktionalität in zukünftigen Swift-Versionen erneut aktiviert wird, wird die Antwort entsprechend aktualisiert.


1212
2018-06-03 00:12



Siehe Apple-Handbuch zu Swift mit Kakao und Objective-C verwenden. Dieser Leitfaden behandelt die Verwendung von Objective-C- und C-Code von Swift und umgekehrt und enthält Empfehlungen zum Konvertieren eines Projekts oder zum Mischen und Anpassen von Objective-C / C- und Swift-Teilen in einem vorhandenen Projekt.

Der Compiler generiert automatisch die Swift-Syntax für den Aufruf von C-Funktionen und Objective-C-Methoden. Wie in der Dokumentation gezeigt, ist dieses Objective-C:

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

verwandelt sich in diesen Swift-Code:

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

Xcode führt diese Übersetzung auch direkt durch - Sie können Open Quickly während der Bearbeitung einer Swift-Datei verwenden und einen Objective-C-Klassennamen eingeben, und Sie gelangen zu einer Swift-Version des Klassenheaders. (Sie können dies auch durch Klicken auf ein API-Symbol in einer Swift-Datei erreichen.) Und die gesamte API-Referenzdokumentation in der iOS 8 und OS X v10.10 (Yosemite) Entwicklerbibliotheken sind sowohl in Objective-C- als auch in Swift-Formularen (z.B. UIView).


101
2018-06-02 20:43



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

  1. Fügen Sie Ihrem Swift-Projekt eine Objective-C-Datei hinzu indem Sie Datei -> Neu -> Neue Datei -> Ziel-C-Datei wählen. Nach dem Speichern Xcode fragt, ob Sie einen Überbrückungs-Header hinzufügen möchten. Wählen 'Ja". GIF: Hinzufügen einer leeren Datei zum Projekt und Erzeugen eines Bridging-Headers http://www.derrrick.com/stackoverflow/1-empty-file.gif

In einfachen Schritten:

  1. Eine Eingabeaufforderung erscheint, und klicken Sie dann auf OK ... Wenn es nicht erscheint, dann erstellen wir es manuell wie im Folgenden ... Erstellen Sie eine Header-Datei von iOS-Quelle und geben Sie den Namen ProjectName-Bridging-Header (Beispiel: Test -Bridging-Header), und gehen Sie dann zu Build-Einstellung im Swift Compiler-Code -> Objective-C Brücke hinzufügen Objective-C Bridge-Namen .. (Test / Test-Bridging-Header.h). Ja, das ist komplett.

  2. Löschen Sie optional die von Ihnen hinzugefügte Objective-C-Datei (im GIF-Bild oben "Alles" genannt). Du brauchst es nicht mehr.

  3. Öffnen Sie die Bridging-Header-Datei - Der Dateiname ist von der Form [YourProject] -Bridging-Header.h. Es enthält einen von Xcode bereitgestellten Kommentar. Fügen Sie eine Codezeile für die Objective-C-Datei hinzu, die Sie einschließen möchtenwie ein Framework von Drittanbietern. Um beispielsweise Mixpanel zu Ihrem Projekt hinzuzufügen, müssen Sie der Bridging-Header-Datei die folgende Codezeile hinzufügen:

    #import "Mixpanel.h"
  4. Jetzt in jeder Swift-Datei können Sie Verwenden Sie vorhandenen Objective-C-Code in der Swift-Syntax (im Fall dieses Beispiels, und Sie können Mixpanel SDK-Methoden aufrufen, etc.). Sie müssen sich damit vertraut machen, wie Xcode Objective-C in Swift übersetzt. Apple-Handbuch ist eine schnelle Lektüre. Oder sehen Sie diese Antwort für eine unvollständige Zusammenfassung.

Beispiel für Mixpanel:

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

Das ist es!

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


49
2018-02-12 19:34



Sie können den netten Beitrag lesen Swift & Cocoapoden. Im Grunde müssen wir eine Bridging-Header-Datei erstellen und alle Objective-C-Header dort ablegen. Und dann müssen wir es aus unseren Build-Einstellungen beziehen. 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 Apples Dokument an Swift mit Kakao und Objective-C verwenden auch.


30
2018-06-04 02:11



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

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

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

Der Schlüssel besteht darin, einen freigegebenen Header, Project-Bridging-Header.h, zu erstellen und die Objective-C-Header dort einzufügen.

Bitte laden Sie das Projekt als komplettes Beispiel herunter.


19
2018-06-13 10:10



Zitat aus der Dokumentation:

Jedes Objective-C-Framework (oder C-Bibliothek), auf das als Modul zugegriffen werden kann   kann direkt in Swift importiert werden. Dies beinhaltet alle   Objective-C-Systemframeworks wie Foundation, UIKit und   SpriteKit - sowie allgemeine C-Bibliotheken, die mit dem System geliefert werden. Zum   Um zum Beispiel Foundation zu importieren, fügen Sie diese Importanweisung einfach zu   Oben in der Swift-Datei, in der Sie arbeiten:

import Foundation

Durch diesen Import werden alle Foundation APIs einschließlich NSDate, NSURL,   NSMutableData und alle ihre Methoden, Eigenschaften und   Kategorien - direkt verfügbar in Swift.


17
2018-06-02 20:43



Eine weitere Sache möchte ich hier hinzufügen:

Ich bin sehr dankbar für @ Logans Antwort. Es hilft viel, eine Bridge-Datei und Setups zu erstellen.

Aber nachdem ich all diese Schritte gemacht habe, bekomme ich immer noch keine Objective-C Klasse in Swift.

Ich habe das benutzt cocoapods Bibliothek und integrierte es in mein Projekt. Welches ist pod "pop".

Wenn Sie also Objective-C-Pods in Swift verwenden, besteht die Möglichkeit, dass Sie nicht oder nicht in der Lage sind import die Klassen in Swift.

Die einfache Sache, die Sie tun müssen, ist:

  1. Gehe zu <YOUR-PROJECT>-Bridging-Header Datei und
  2. Ersetzen Sie die Aussage #import <ObjC_Framework> zu @import ObjC_Framework

Zum Beispiel: (Pop-Bibliothek)

Ersetzen

#import <pop/POP.h>

mit

@import pop;

Benutzen clang import wann #import funktioniert nicht.


15
2017-09-16 07:00



Nur ein Hinweis für alle, die Swift eine Objective-C-Bibliothek hinzufügen möchten: Sie sollten hinzufügen -ObjC im Einstellungen erstellen -> Verknüpfung -> Andere Linker-Flags.


7
2018-03-20 17:53



Nachdem Sie einen Bridging-Header erstellt haben, gehen Sie zu Build Setting => Suchen Sie nach "Objective-C Bridging Header".

Direkt darunter finden Sie die Datei "Objective-C Generated Interface Header Name".

Importieren Sie diese Datei in Ihren View-Controller.

Beispiel: In meinem Fall: "Dauble-Swift.h"

eEter image description here


3
2017-11-25 08:29



Klicken Sie auf Neu Dateimenü und wähle Datei Sprache auswählen Ziel. Zu diesem Zeitpunkt wird automatisch eine "Objective-C Bridging Header" -Datei generiert, die zur Definition eines Klassennamens verwendet wird.

"Objective-C Bridging Header" unter "Swift Compiler - Codegenerierung".


2
2017-09-10 12:16