Wie kann ich Swift-Code in Objective-C importieren?

281

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

Gibt es Möglichkeiten, es zu importieren?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Viktor Radchenko
quelle
9
liebe dieses Projekt!
SleepsOnNewspapers

Antworten:

430

Sie müssen importieren TargetName-Swift.h. 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 Anmerkungen versehen sind @objcoder von denen sie erben NSObject.

Überlegungen:

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

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

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

Rechnung
quelle
5
Beachten Sie, dass beim Versuch, den Swift-Dateinamen für Ihren Import zu verwenden, die Fehlermeldung "Erwartet ';' angezeigt wird. nach dem Deklarator der obersten Ebene ". in Ihrer Swift-Datei nach "Foundation importieren".
Louielouie
8
BEARBEITEN: Hinweis: Damit dies funktioniert, MUSS ein Projektmodulname definiert werden. Siehe: stackoverflow.com/a/24064015/2085743
Ruben Martinez Jr.
7
Ich möchte nur einen Hinweis hinzufügen, dass wenn Ihr Projektname Leerzeichen oder Sonderzeichen enthält, Sie diese durch Unterstriche ersetzen müssen, wie "Meine App" wäre "My_App-Swift.h"
Hola Soja Edu Feliz Navidad
84
Warum ist das so schwer und schlecht dokumentiert?
Uchuugaka
3
@lelelo Nein, diese Datei ist das Gegenteil von dieser. Der Bridging-Header wurde vom Entwickler geschrieben und ermöglicht es Ihnen, Objective-C- und C-Symbole in Ihren Swift-Code zu integrieren. Die Datei Target-Swift.h wird automatisch generiert und ermöglicht Ihrem Objective-C / C-Code den Zugriff auf Swift-Symbole.
Bill
154

Anweisungen von der Apple-Website:

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

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

#import "ProductName-Swift.h"

Revision:

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

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

Importieren Sie Swift nicht in eine Objective-C-Headerdatei, um zyklische Verweise zu vermeiden. Stattdessen können Sie eine Swift-Klasse weiterleiten, um sie in einem Objective-C-Header zu verwenden. Beachten Sie, dass Sie in Objective-C keine Swift-Klasse unterordnen können.

Geben Sie hier die Bildbeschreibung ein

Andrei Papancea
quelle
2
Nur der Import von "ProductName-Swift.h" in .m-Dateien hat mir geholfen. Das Hinzufügen derselben in der .pch-Datei ergab "Protokolldeklaration für 'CLLocationManagerDelegate' kann nicht gefunden werden; meinten Sie 'NSLayoutManagerDelegate'?"
Alphonse R. Dsouza
@AJit es nicht direkt, die Dokumentation sagt das. Am einfachsten ist es, eine Objective-C-Klasse zu erstellen, die in ein Format übersetzt wird, das Objective-C ++ versteht. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Alejandro Iván
1
Beachten Sie, dass Sie von ableiten müssen NSObject!!! Sie können nicht einfach ein class Blah schnelles deklarieren und es funktionieren lassen. es muss seinclass Blah : NSObject
David T.
In einigen Fällen lohnt es sich, diese Antwort zu lesen: stackoverflow.com/questions/26328034/… Je nachdem, was Sie tun: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333
Was ist, wenn Sie eine Swift-Erweiterung importieren möchten?
Ricardo
150

Folgendes ist zu tun:

  1. Erstellen Sie ein neues Projekt in Objective-C

  2. Erstellen Sie eine neue .swiftDatei  

    • Ein Popup-Fenster wird angezeigt und Sie werden gefragt, ob Sie einen Objective-C-Bridging-Header konfigurieren möchten .
    • 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 Defines Module .

  6. Ändern Sie den Wert in Ja .

  7. Suchen Sie nach dem Namen des Produktmoduls .

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

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


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

#import "YourProjectName-Swift.h"

Sumit singh
quelle
1
Den Wert von Defines modulein Build settingszu ändern , Yesist das, was für mich behoben wurde!
Zakaria Braksa
Eingebetteter Inhalt enthält Swift: JA BENUTZEN Sie dies auch
Mohit
4
Gute Antwort, aber die Schritte 7-8 sind in Xcode 7.3.1 und höher nicht erforderlich
Sam B
Hat für mich gearbeitet! Vielen Dank.
itsdamslife
1
Ich möchte nur hinzufügen, dass YourProjectNamein #import "YourProjectName-Swift.h"der Name des Projekts aus Schritt 8 enthalten ist. Nützlich, wenn Ihr Projektname Sonderzeichen enthält und Sie nicht sicher sind, wie genau Sie ihn formatieren sollen.
Chuck Boris
40

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

@import <FrameworkName>;

Geben Sie hier die Bildbeschreibung ein

KingPolygon
quelle
1
Vielen Dank! du hast meinen Tag gerettet.
Esha
Dies funktioniert wie ein Zauber, wenn wir eine schnell erstellte Bibliothek über Cocoapods installiert haben. Upvoted !!!
NSPratik
21

Gehen Sie zu Build-Einstellungen in Ihrer Projektdatei und suchen Sie nach "Objective-C Generated Interface Header Name" . Der Wert dieser Eigenschaft ist der Name, den Sie einschließen sollten.

Wenn Ihre Eigenschaft "Name des Produktmoduls" (die Eigenschaft, von der die obige Eigenschaft standardmäßig abhängt) davon abhängt, ob Sie für test / debug / release / etc kompilieren (wie in meinem Fall), machen Sie diese Eigenschaft davon unabhängig Variation durch Festlegen eines benutzerdefinierten Namens.

Lukas Kalinski
quelle
15

Das Importieren einer SwiftDatei Objective-ckann diesen Fehler verursachen, wenn er nicht importordnungsgemäß ausgeführt wird.

HINWEIS: Sie müssen Swift-Dateien nicht extern importieren, sondern nur eine Datei importieren, die sich um Swift-Dateien kümmert.

Wenn Sie eine Swift-Datei in einem Objective-C-Projekt erstellt / kopiert haben . Es hätte automatisch einen Bridging-Header erstellt.

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

Geben Sie hier die Bildbeschreibung ein

Basierend auf oben werde ich importieren, KJExpandable-Swift.hwie es ist.

Ihr wird sein TargetName-Swift.h, wo TargetNamesich basierend auf Ihrem Projektnamen oder einem anderen Ziel, das Sie möglicherweise hinzugefügt haben und das darauf ausgeführt wird, unterscheidet.

Wie unter meinem Ziel ist KJExpandable, so ist esKJExpandable-Swift.h
Geben Sie hier die Bildbeschreibung ein

Kiran Jasvanee
quelle
12

Erster Schritt:-

Wählen Sie Projektziel -> Build-Einstellung -> Suchen ('Definieren') -> Modulaktualisierungswert definieren Nein zu Ja

"Definiert das Modul": JA .

"Immer schnelle Standardbibliotheken einbetten": JA .

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

Geben Sie hier die Bildbeschreibung ein

Zweiter Schritt:-

Fügen Sie die Swift-Dateiklasse in 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 (Ihr Projektname) -Swift.h' in die Datei Objective C ".m"

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

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

#import "ProjectName-Swift.h"
Darshan Panchal
quelle
Die Vorwärtsdeklaration (@class) der Klasse ist ein sehr guter Punkt! Vielen Dank!
Philipp Otto
10

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

#import <MyFramework/MyFramework-Swift.h>

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

Das einfache Hinzufügen #import "MyFramework-Swift.h"funktioniert nicht. Wenn Sie das Verzeichnis der erstellten Produkte überprüfen (bevor ein solches #importhinzugefügt wird, sodass Sie mindestens eine erfolgreiche Erstellung mit etwas Swift-Code im Ziel hatten), sollte die Datei weiterhin MyFramework-Swift.him HeadersVerzeichnis angezeigt werden.

Mischa Karpenko
quelle
8

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-upgrading-to-swift-4/

Prashant Bhayani
quelle
In meinem Code, nachdem ich es von Swift 3 auf Swift 4.2 aktualisiert habe. Es funktioniert nicht
SNarula
Welchen Fehler bekommst du? Ich habe den obigen Code in Swift4.2 verwendet und er funktioniert einwandfrei.
Prashant Bhayani
Okay das ist super.
Prashant Bhayani
4

Lesen Sie die Pre-Release-Hinweise 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"
Nitin Alabur
quelle
3
Zeigte mir diesen Fehler: 'SCLAlertView-Swift.h' Datei nicht gefunden.
Viktor Radchenko
2
Muss der Projektname sein, nicht der Dateiname - siehe meine Antwort.
Bill
1
Danke für den Dokumentationslink. Das war nützlich als Referenz.
Louielouie
2
Um aus dem bereitgestellten Link zu zitieren: The name of this header is your product module name followed by adding "-Swift.h".Es ist also nicht der Klassenname, wie Sie ihn geschrieben haben, sondern der Name Ihres Produktmoduls, der dafür sorgt, dass alle schnellen Dateien importiert werden, nicht nur eine bestimmte
Chris
4

Suchen Sie in den Build-Einstellungen des Ziels, das Sie erstellen möchten (sagen wir, es ist ) nach "Objective-C Generated Interface Header Name"MyApp-Swift.h und importieren Sie den Wert dieser Einstellung ( #import "MyApp-Swift.h") in die Quelldatei, auf die Sie zugreifen möchten Ihre Swift-APIs.

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

Wenn Ihr Modulname Bindestriche enthält (sagen wir, es ist My-App), werden $(SWIFT_MODULE_NAME)alle Bindestriche durch Unterstriche ersetzt. Dann müssen Sie hinzufügen #import "My_App-Swift.h".

Mischa Karpenko
quelle
Besser als die genehmigten. Die Striche sind 20 Minuten vergeudet. Ich werde nie zurückkommen, haha.
Roi Mulia
3

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

Wenn Sie das Projekt in Objective-C erstellt haben:

  1. Erstellen Sie eine neue Swift-Datei
  2. Xcode fordert automatisch zur Eingabe der Bridge-Header-Datei auf
  3. Generiere es
  4. Importieren Sie "ProjectName-Swift.h" in Ihren Objective-C-Controller (Import in der Implementierung nicht in die 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 wenn es einen Linker-Fehler erzeugt wie: Kompiliert mit einer neueren Version der Swift-Sprache (3.0) als frühere Dateien (2.0) für die Architektur x86_64 oder armv 7

Nehmen Sie noch eine Änderung an Ihrem vor

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

Erstellen und ausführen.

Dheeraj D.
quelle
1
Ich
bekomme
1

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

Striche und Unterstriche

Naloiko Eugene
quelle
1
#import <TargetName-Swift.h>

Sie werden sehen, wenn Sie über die Tastatur #import <eingeben und Xcode Sie automatisch darauf hinweist.

Erhan Demirci
quelle
-1

Suchen Sie die .PCH-Datei im Projekt. und dann hinzufügen #import "YourProjectName-Swift.h"Dies importiert die Klassenheader. Damit Sie nicht in eine bestimmte Datei importieren müssen.

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
Ram G.
quelle