it-swarm.com.de

Wie kann ich Swift Code in Objective-C importieren?

Ich habe eine Bibliothek in Swift geschrieben und konnte sie nicht in mein aktuelles Projekt importieren, das in Objective-C geschrieben wurde.

Gibt es irgendwelche Möglichkeiten, es zu importieren?

#import "SCLAlertView.Swift" - 'SCLAlertView.Swift' file not found
261

Sie müssen TargetName-Swift.h importieren. Beachten Sie, dass es sich um den Zielnamen handelt - die anderen Antworten machen den Fehler, den Klassennamen zu verwenden.

Diese einzelne Datei ist ein automatisch generierter Header, der Objective-C-Schnittstellen für alle Swift Klassen in Ihrem Projekt definiert, die entweder mit @objc kommentiert sind oder von NSObject erben.

Überlegungen:

  • Wenn Ihr Zielname Leerzeichen enthält, ersetzen Sie diese durch Unterstriche (z. B. wird My Project zu My_Project-Swift.h).

  • Wenn Ihr Ziel ein Framework ist, müssen Sie <TargetName/TargetName-Swift.h> importieren.

  • Stellen Sie sicher, dass Ihre Swift -Datei Mitglied des Ziels ist

388
Bill

Anweisungen von der Apple Website:

So importieren Sie Swift Code aus demselben Framework in Objective-C

Stellen Sie unter Build Settings in Packaging sicher, dass die Einstellung Defines Module für dieses Framework-Ziel auf Yes festgelegt ist. Importieren Sie den Code Swift von diesem Framework-Ziel in eine beliebige Objective-C .m-Datei in diesem Framework-Ziel. Verwenden Sie dabei diese Syntax und ersetzen Sie die entsprechenden Namen:

# import "ProductName-Swift.h"

Revision:

Sie können nur "ProductName-Swift.h" in .m-Dateien importieren.

Die Swift -Dateien in Ihrem Ziel sind in Objective-C .m-Dateien sichtbar, die diese Importanweisung enthalten.

Um zyklische Referenzen zu vermeiden, importieren Sie Swift nicht in eine Objective-C-Header-Datei. Stattdessen können Sie eine Swift -Klasse weiterleiten, um sie in einem Objective-C-Header zu verwenden. Beachten Sie, dass Sie eine Swift -Klasse in Objective-C nicht in Unterklassen unterteilen können.

enter image description here

139
Andrei Papancea

Hier ist was zu tun:

  1. Erstellen Sie ein neues Projekt in Objective-C

  2. Erstellen Sie eine neue .Swift Datei

    • Es erscheint ein Popup-Fenster mit der Frage "Möchten Sie einen Objective-C-Bridging-Header konfigurieren?" .
    • Wählen Sie Ja.
  3. Klicken Sie auf Ihre Xcode-Projektdatei

  4. Klicken Sie auf Build Settings

  5. Suchen Sie die Suchleiste und suchen Sie nach Modul definieren.

  6. Ändern Sie den Wert in Ja.

  7. Suche Name des Produktmoduls.

  8. Ändern Sie den Wert in den Namen Ihres Projekts.

  9. Fügen Sie in App-Delegat Folgendes hinzu: #import "YourProjectName-Swift.h"


Hinweis: Wenn Sie Ihre Swift -Datei verwenden möchten, müssen Sie folgende Zeile importieren:

#import "YourProjectName-Swift.h"

137
Sumit singh

Wenn Sie Cocoapods verwenden und versuchen, einen Swift -Pod in einem ObjC-Projekt zu verwenden, können Sie einfach Folgendes tun:

@import <FrameworkName>;

enter image description here

33
KingPolygon

Gehen Sie zum Erstellen von Einstellungen in Ihrer Projektdatei und suchen Sie nach "Objective-C-generierter Schnittstellenkopfname". Der Wert dieser Eigenschaft ist der Name, den Sie einschließen sollten.

Wenn Ihre Eigenschaft "Product Module Name" (diejenige, von der die obige Eigenschaft standardmäßig abhängt) davon abhängt, ob Sie sie für Test/Debug/Release/etc kompilieren (wie es in meinem Fall der Fall ist), machen Sie diese Eigenschaft davon unabhängig Variation durch Festlegen eines benutzerdefinierten Namens.

17
Lukas Kalinski

Das Importieren der Datei Swift in Objective-c kann diesen Fehler verursachen, wenn die Datei import nicht ordnungsgemäß funktioniert.

HINWEIS: Sie müssen keine Swift Dateien extern importieren, sondern nur eine Datei, die Swift Dateien verwaltet.

Wenn Sie Erstellt/Kopiert Swift Datei innerhalb Objective-C Projekt. Es hätte automatisch einen Überbrückungsheader erstellt.

Überprüfen Sie Objective-C Generated Interface Header Name unter Targets -> Build Settings.

enter image description here

Basierend auf dem oben Gesagten werde ich KJExpandable-Swift.h so wie es ist importieren.

Ihre wird TargetName-Swift.h sein, wobei TargetName sich aufgrund Ihres Projektnamens oder eines anderen Ziels unterscheidet, das Sie möglicherweise hinzugefügt haben und auf dem Sie ausgeführt werden.

Wie unten ist mein Ziel KJExpandable, also ist es KJExpandable-Swift.h
enter image description here

12
Kiran Jasvanee

Erster Schritt: -

Wählen Sie Projektziel -> Build-Einstellung -> Suchen ('Definieren') -> Modul definieren Aktualisierungswert Nein bis Ja

"Definiert Modul": YES.

"Immer Swift Standardbibliotheken einbetten": YES.

"Objective-C-Kompatibilitätsheader installieren": YES.

enter image description here

Zweiter Schritt: -

Fügen Sie die Swift - Dateiklasse in der Objective C ".h" -Datei wie folgt hinzu

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Importieren Sie "ProjectName (Your Project Name) -Swift.h" in die Objective C ".m" -Datei

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"
9
Darshan Panchal

Es gibt eine Einschränkung, wenn Sie Swift Code in Ihre Objective-C-Dateien importieren innerhalb desselben Frameworks. Dazu müssen Sie den Frameworknamen und die spitzen Klammern angeben:

#import <MyFramework/MyFramework-Swift.h>

MyFramework Hier ist die Build-Einstellung "Product Module Name" (PRODUCT_NAME = MyFramework).

Das Hinzufügen von #import "MyFramework-Swift.h" wird nicht funktionieren. Wenn Sie das Verzeichnis für erstellte Produkte überprüfen (bevor ein solcher #import hinzugefügt wird, sodass Sie mindestens einen erfolgreichen Build mit einem Swift - Code im Ziel hatten), sollte weiterhin das angezeigt werden Datei MyFramework-Swift.h im Verzeichnis Headers.

8
Misha Karpenko

Wenn Sie ein Projekt in Swift 4 erstellt und anschließend Objective-C-Dateien hinzugefügt haben, gehen Sie folgendermaßen vor:

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

Referenz: https://useyourloaf.com/blog/objc-warnings-upgrade-to-Swift-4/

6

Lesen Sie die Vorabversionshinweise zu Swift und Objective C im selben Projekt

https://developer.Apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//Apple_ref/doc/uid/TP40014216-CH10-XID_75

Sie sollten importieren

#import "SCLAlertView-Swift.h"
4
Nitin Alabur

Suchen Sie in den Build-Einstellungen des zu erstellenden Ziels nach "Objective-C Generated Interface Header Name" (sagen wir, es ist MyApp-Swift.h), und importieren Sie den Wert dieser Einstellung ( #import "MyApp-Swift.h") in der Quelldatei, in der Sie versuchen, auf Ihre Swift APIs zuzugreifen.

Der Standardwert für dieses Feld ist $(Swift_MODULE_NAME)-Swift.h. Sie sehen es, wenn Sie in das Wertefeld der Einstellung "Objective-C Generated Interface Header Name" doppelklicken.

Wenn der Modulname Bindestriche enthält (sagen wir, es ist My-App), werden in $(Swift_MODULE_NAME) alle Bindestriche durch Unterstriche ersetzt. Dann musst du #import "My_App-Swift.h" hinzufügen.

4
Misha Karpenko

Wenn Sie Swift file in Objective-C class verwenden möchten, können Sie ab Xcode 8 die folgenden Schritte ausführen:

Wenn Sie das Projekt in Objective-C erstellt haben:

  1. Neue Swift Datei erstellen
  2. Xcode fordert automatisch zur Eingabe von Bridge-Header-Datei auf
  3. Generiere es
  4. Importieren Sie "ProjectName-Swift.h" in Ihre Objective-C-Steuerung (Import in Implementierung, nicht in Schnittstelle) (wenn Ihr Projekt zwischen den Namen Leerzeichen enthält, verwenden Sie den Unterstrich "Project_Name-Swift.h").
  5. Sie können in Swift auf Ihre Objective-C-Klasse zugreifen.

Kompilieren Sie es und erzeugen Sie einen Linker-Fehler wie: Kompiliert mit einer neueren Version von Swift (3.0) als die vorherigen Dateien (2.0) für Architektur x86_64 oder armv 7

Nehmen Sie eine weitere Änderung in Ihrem vor

  1. Xcode -> Projekt -> Ziel -> Build-Einstellungen -> Legacy verwenden Swift Sprachversion -> Ja

Bauen und ausführen.

2
Dheeraj D

Seien Sie vorsichtig mit Bindestrichen und Unterstrichen, diese können verwechselt werden und Ihr Projektname und Ihr Zielname stimmen nicht mit Swift_MODULE_NAME überein.

Dashes and underscores

0
Naloiko Eugene
#import <TargetName-Swift.h>

sie werden sehen, wenn Sie über die Tastatur #import <eingeben, und Xcode wird Sie automatisch beraten.

0
Erhan Demirci