Wie ruft man in Swift Objective-C-Code auf?
Apple erwähnte, dass sie in einer Anwendung nebeneinander existieren könnten. Bedeutet dies jedoch, dass alte in Objective-C erstellte Klassen technisch wiederverwendet werden könnten, während neue Klassen in Swift erstellt werden?
objective-c
swift
David Mulder
quelle
quelle
Antworten:
Verwenden von Objective-C-Klassen in Swift
Schritt 1: Hinzufügen der Objective-C-Implementierung - .m
Fügen Sie
.m
Ihrer Klasse eine Datei hinzu und benennen Sie sieCustomObject.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:Schritt 3: Fügen Sie den Objective-C-Header hinzu - .h
Fügen Sie eine weitere
.h
Datei hinzu und benennen Sie sieCustomObject.h
.Schritt 4: Erstellen Sie Ihre Objective-C-Klasse
Im
CustomObject.h
Im
CustomObject.m
Schritt 5: Klasse zum Bridging-Header hinzufügen
In
YourProject-Bridging-Header.h
:Schritt 6: Verwenden Sie Ihr Objekt
In
SomeSwiftFile.swift
: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 sieMySwiftObject.swift
.In
MySwiftObject.swift
:Schritt 2: Importieren Sie Swift-Dateien in die ObjC-Klasse
In
SomeRandomClass.m
: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
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 erhaltendyld: 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 entsprichtNSObjectProtocol
(der einfachste Weg, dies zu tun, besteht darin, von dieser zu erbenNSObject
), oder eineenum
Markierung@objc
mit einem Rohwert eines ganzzahligen Typs wieInt
. Sie können den Bearbeitungsverlauf für ein Beispiel für Swift 1.x-Code@objc
ohne diese Einschränkungen anzeigen .quelle
Siehe Apples Handbuch zur Verwendung von Swift mit Kakao und Objective-C . Dieses Handbuch 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 zum Aufrufen von C-Funktionen und Objective-C-Methoden. Wie in der Dokumentation zu sehen ist, ist dieses Ziel-C:
verwandelt sich in diesen Swift-Code:
Xcode führt diese Übersetzung auch im laufenden Betrieb durch. Sie können Open Quickly verwenden, während Sie eine Swift-Datei bearbeiten und einen Objective-C-Klassennamen eingeben, und Sie gelangen zu einer Swift-ified-Version des Klassenheaders. (Sie können dies auch erhalten, indem Sie mit der Cmd auf ein API-Symbol in einer Swift-Datei klicken.) Die gesamte API-Referenzdokumentation in den Entwicklerbibliotheken für iOS 8 und OS X 10.10 (Yosemite) ist sowohl in Objective-C als auch in Swift sichtbar Formen (zB
UIView
).quelle
Hier finden Sie schrittweise Anweisungen zur Verwendung von Objective-C-Code (in diesem Fall eines von einem Drittanbieter bereitgestellten Frameworks) in einem Swift-Projekt:
In einfachen Schritten:
Eine Eingabeaufforderung wird angezeigt, und klicken Sie dann auf OK. Wenn sie nicht angezeigt wird, erstellen wir sie manuell wie folgt: Erstellen Sie eine Header-Datei aus einer iOS-Quelle und geben Sie den Namen ProjectName-Bridging-Header an (Beispiel: Test -Bridging-Header), und gehen Sie dann zur Build-Einstellung im Swift-Compiler-Code -> Objective-C-Bridge und fügen Sie den Objective-C-Bridge-Namen hinzu. (Test / Test-Bridging-Header.h). Ja, das ist komplett.
Löschen Sie optional die von Ihnen hinzugefügte Objective-C-Datei (im obigen GIF-Bild als "irgendetwas" bezeichnet). Du brauchst es nicht mehr.
Öffnen Sie die Bridging-Header-Datei - der Dateiname hat die 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öchten , z. B. ein Framework eines Drittanbieters. Um beispielsweise Mixpanel zu Ihrem Projekt hinzuzufügen, müssen Sie der Bridging-Header-Datei die folgende Codezeile hinzufügen:
Jetzt können Sie in jeder Swift-Datei vorhandenen Objective-C-Code in der Swift-Syntax verwenden (in diesem Beispiel können Sie Mixpanel SDK-Methoden usw. aufrufen). Sie müssen sich damit vertraut machen, wie Xcode Objective-C in Swift übersetzt. Apples Leitfaden ist eine schnelle Lektüre. Oder sehen Sie sich diese Antwort für eine unvollständige Zusammenfassung an.
Beispiel für Mixpanel:
Das ist es!
Hinweis: Wenn Sie die Bridging-Header-Datei aus Ihrem Projekt entfernen, gehen Sie in die Build-Einstellungen und entfernen Sie den Wert für " Objective-C Bridging-Header " unter "Swift Compiler - Code Generation".
quelle
Sie können den schönen Beitrag Swift & Cocoapods lesen . Grundsätzlich 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 referenzieren. Danach können wir den Objective-C-Code verwenden.
Schauen Sie sich auch Apples Dokument Using Swift with Cocoa und Objective-C an.
quelle
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
Das Beispiel ruft insbesondere eine Objective-C- und eine C ++ - Funktion von Swift auf .
Der Schlüssel besteht darin, einen gemeinsam genutzten Header, Project-Bridging-Header.h, zu erstellen und die Objective-C-Header dort abzulegen.
Bitte laden Sie das Projekt als vollständiges Beispiel herunter.
quelle
Eine weitere Sache möchte ich hier hinzufügen:
Ich bin sehr dankbar für die Antwort von @ Logan. Es ist sehr hilfreich, eine Bridge-Datei und Setups zu erstellen.
Aber nach all diesen Schritten bekomme ich immer noch keine Objective-C-Klasse in Swift.
Ich habe die
cocoapods
Bibliothek benutzt und in mein Projekt integriert. Welches istpod "pop"
.Wenn Sie also Objective-C-Pods in Swift verwenden, besteht möglicherweise die Möglichkeit, dass Sie
import
die Klassen nicht in Swift aufnehmen können.Das Einfache, was Sie tun müssen, ist:
<YOUR-PROJECT>-Bridging-Header
Datei und#import <ObjC_Framework>
durch@import ObjC_Framework
Zum Beispiel: (Pop-Bibliothek)
Ersetzen
mit
Verwenden Sie,
clang import
wenn#import
nicht funktioniert.quelle
Zitat aus der Dokumentation :
quelle
Nur ein Hinweis für alle, die versuchen, Swift eine Objective-C-Bibliothek hinzuzufügen: Sie sollten -ObjC unter Build-Einstellungen -> Verknüpfen -> Andere Linker-Flags hinzufügen .
quelle
Nachdem Sie einen Bridging-Header erstellt haben, gehen Sie zu Build Setting => Suche 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"
quelle
Klicken Sie auf das Menü Neue Datei und wählen Sie die Dateiauswahlsprache Ziel. Zu diesem Zeitpunkt wird automatisch eine "Objective-C Bridging Header" -Datei generiert, mit der ein Klassenname definiert wird.
"Objective-C Bridging Header" unter "Swift Compiler - Code Generation".
quelle
quelle
Ich habe das Projekt auf Github hinzugefügt, das ein kleines Beispiel enthält, um den objektiven C-Code von Swift aufzurufen.
Rufen Sie die ObjectiveC-Klasse von swift aus auf
quelle
Im Swift 4.2.1-Projekt in Xcode 10.1 können Sie problemlos eine Objective-C-Datei hinzufügen. Führen Sie die folgenden Schritte aus, um die Objective-C-Datei mit dem Swift-Projekt zu verbinden.
Schritt_01: Erstellen Sie ein neues Xcode-Projekt in der Swift-Sprache:
File
>New
>Project
>objc
.Schritt_02: Fügen Sie im Swift-Projekt eine neue Objective-C-Datei hinzu:
File
>New
>File...
>macOS
>Objective-C File
.Schritt_03: Wenn Sie Swift Project zum ersten Mal eine neue Objective-C-Datei hinzufügen, werden Sie von Xcode gefragt:
Would you like to configure an Objective-C bridging header
?Schritt_04: Wählen Sie die Option:
Create Bridging Header
.Schritt_05: Eine entsprechende Datei wird mit einem Namen generiert:
Objc-Bridging-Header.h
.Schritt_06: Jetzt müssen Sie den Bridge-Dateipfad im Bridge-Header einrichten. Klicken Sie im Projektnavigator auf Projekt mit Namen
objc
und wählen Sie dann:Build Settings
>Objective-C Bridging Header
>Objc-Bridging-Header.h
.Schritt_07: Ziehen Sie Ihre
Objc-Bridging-Header.h
Datei in dieses Feld, um einen Dateipfad zu generieren.Schritt_08: Öffnen Sie Ihre
Objc-Bridging-Header.h
Datei und importieren Sie die Objective-C-Datei, die Sie in Ihrer Swift-Datei verwenden möchten.Hier ist ein Inhalt von
SpecialObjcFile.m
:Schritt_09: Jetzt können Sie in Ihrer Swift-Datei eine Objective-C-Klasse verwenden:
quelle
Die Antwort von Logans funktioniert einwandfrei, außer dass in letzter Zeit
Swift 5
ein Compilerfehler auftritt. Hier ist der Fix für Leute, die an Swift 5 arbeiten.Swift 5
quelle
Schneller Verbraucher, Objective-C-Produzent
Fügen Sie einen Header
.h
und.m
Implementierungsdateien - Cocoa Klassendatei (Objective-C)Zum Beispiel
MyFileName
Bridging-Header konfigurieren
Wenn Sie sehen,
Would you like to configure an Objective-C bridging header
klicken Sie auf - Ja<target_name>-Bridging-Header.h
wird automatisch generiertIn der Klasse zu Bridging-Header -
In
<target_name>-Bridging-Header.h
fügen Sie eine Zeile#import "<MyFileName>.h"
PS Wenn Sie vorhandene Objective-C-Dateien zum Swift-Projekt hinzufügen sollten, fügen Sie diese
Bridging-Header.h
vorher hinzuObjective-C-Verbraucher, Swift-Produzent
Fügen Sie ein
<MyFileName>.swift
und erweitertNSObject
Importieren von Swift-Dateien in die ObjC-Klasse
Fügen Sie sie
#import "<#YourProjectName#>-Swift.h"
in Ihre Objective-C-Datei einMarkieren Sie den öffentlichen Swift-Code [@objc und @objcMembers].
quelle
Apple hat in diesem Dokument einen offiziellen Leitfaden bereitgestellt: How-to-Call-Objective-C-Code-from-Swift
Hier ist der relevante Teil:
Um eine Reihe von Objective-C-Dateien in Swift-Code innerhalb desselben App-Ziels zu importieren, verwenden Sie eine Objective-C-Bridging-Header-Datei, um diese Dateien für Swift verfügbar zu machen . Xcode bietet an, diesen Header zu erstellen, wenn Sie einer vorhandenen Objective-C-App eine Swift-Datei oder einer vorhandenen Swift-App eine Objective-C-Datei hinzufügen.
Wenn Sie zustimmen, erstellt Xcode die Bridging-Header-Datei zusammen mit der von Ihnen erstellten Datei und benennt sie unter Verwendung Ihres Produktmodulnamens, gefolgt von "-Bridging-Header.h". Alternativ können Sie selbst einen Bridging-Header erstellen, indem Sie Datei> Neu> Datei> [Betriebssystem]> Quelle> Header-Datei wählen
Bearbeiten Sie den Bridging-Header, um Ihren Objective-C-Code Ihrem Swift-Code zugänglich zu machen:
Alle öffentlichen Objective-C-Header, die im Bridging-Header aufgeführt sind, sind für Swift sichtbar.
quelle
Zwei-Wege-Ansatz zur Verwendung von Ziel-c Ziel-c
1
2
Nun gut, danke
quelle