Ich versuche, Swift
Code in meine App zu integrieren. Meine App ist geschrieben Objective-C
und ich habe eine Swift
Klasse hinzugefügt . Ich habe alles hier beschrieben . Aber mein Problem ist, Xcode
dass nicht die -Swift.h
Datei erstellt wurde, sondern nur die Bridging-Header. Also habe ich es erstellt, aber es ist tatsächlich leer. Ich kann alle meine ObjC-Klassen in Swift verwenden, aber ich kann es nicht umgekehrt tun. Ich habe meine schnelle Klasse mit markiert, @objc
aber es hat nicht geholfen. Was kann ich jetzt machen?
BEARBEITEN: Apple sagt: "Wenn Sie Swift-Code in Objective-C importieren, verlassen Sie sich auf eine Xcode-generated
Header-Datei, um diese Dateien für Objective-C verfügbar zu machen . [...] Der Name dieses Headers ist der Name Ihres Produktmoduls, gefolgt vom Hinzufügen von" -Swift.h "."
Wenn ich diese Datei importieren möchte, wird ein Fehler angezeigt:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
Hier ist meine FBManager.swift-Datei:
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
quelle
YourProjectName-Swift.h
sollte eine magische Header-Datei sein, die Xcode während der Kompilierung automatisch für Sie erstellt (Sie werden sie im Projektbrowser nicht wirklich sehen). Löschen Sie die von Ihnen erstellte#import YourProjectName-Swift.h
Datei und fügen Sie sie zu den Dateien hinzu, in denen Sie die Swift-Klassen verwenden möchten.myProjectModule
? Die-Swift.h
Datei sollte mit Ihrem App-Namen beginnen. Haben Sie eine Datei, die auf endet-Bridging-Header.h
? Du solltest. In diesem Fall ist der erste Teil dieser Datei Ihr Projektname. Kombinieren Sie den ersten Teil dieses Dateinamens mit-Swift.h
und das sollten Sie einschließen.-Swift.h
, die auf meinem Mac endet , und dennoch kann ich sie einschließen. Lassen Sie sich also nicht auf die Suche nach einer solchen Datei ein. Stellen Sie einfach sicher, dass Sie es richtig benennen.#import <MyProjectName/MyProjectName-Swift.h>
Antworten:
Ich habe ungefähr 4 Stunden lang versucht,
Swift
meinXcode
Objective-C-basiertes Projekt zu aktivieren . Meinemyproject-Swift.h
Datei wurde erfolgreich erstellt, aber meineXcode
hat meine nicht gesehenSwift-classes
. Also habe ich beschlossen, ein neuesXcode
Objc-basiertes Projekt zu erstellen und schließlich die richtige Antwort gefunden! Hoffe dieser Beitrag hilft jemandem :-)Schritt für Schritt Schnelle Integration für ein Xcode Objc-basiertes Projekt:
*.swift
Datei (in Xcode) oder fügen Sie sie mit dem Finder hinzu.Objective-C bridging header
wenn Xcode Sie danach fragt.Implementieren Sie Ihre Swift-Klasse:
Öffnen Sie die Build-Einstellungen und überprüfen Sie die folgenden Parameter:
YES
myproject
YES
myproject-Swift.h
$(SRCROOT)/myproject-Bridging-Header.h
Importieren Sie den Swift-Schnittstellenheader in Ihre * .m-Datei.
quelle
"myproject-Swift.h"
daher scheint es mir, dass sie nicht funktioniert. Anscheinend ist diese Datei im Projektnavigator nicht sichtbar.#import "myproject-Swift.h"
.Erstellen Sie die Header-Datei nicht selbst. Löschen Sie die von Ihnen erstellte.
Stellen Sie sicher, dass Ihre Swift-Klassen mit
@objc
einer Klasse markiert sind oder von dieser erben, die (direkt oder indirekt) von dieser abgeleitet istNSObject
.Xcode generiert die Datei nicht, wenn Sie Compilerfehler in Ihrem Projekt haben - stellen Sie sicher, dass Ihr Projekt sauber erstellt wird.
quelle
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u
zu sehen, ob die Datei mit einem unerwarteten Namen erstellt wurde, wie er für mich war. :)Erlauben Sie Xcode, seine Arbeit zu erledigen, und fügen Sie den Swift-Header nicht manuell hinzu. Fügen Sie einfach @objc vor Ihrer Swift-Klasse hinzu.
Suchen Sie in Ihrer Projekteinstellung nach den folgenden Flags und ändern Sie sie in JA (sowohl Projekt als auch Ziel).
Bereinigen Sie dann das Projekt und erstellen Sie es einmal. Nachdem der Build erfolgreich war (sollte es wahrscheinlich sein), importieren Sie es unter der Header-Datei in Ihre M-Datei der Objective-C-Klasse
Boooom!
quelle
Basic
zuAll
in der oberen Leiste.Embedded Content Contains Swift
wurde geändertAlways Embed Swift Standard Libraries
mit Xcode 8: stackoverflow.com/questions/38792650/…Wahrscheinlich auch hilfreich für diejenigen unter Ihnen, die ein Framework-Ziel haben :
Die import-Anweisung der automatisch generierten Header-Datei unterscheidet sich ein wenig von den App-Zielen. Zusätzlich zu den anderen in anderen Antworten genannten Dingen verwenden
anstatt
gemäß der Apples-Dokumentation zu Mix & Match für Framework-Ziele.
quelle
Stellen Sie sicher, dass Ihr Projekt ein Modul definiert und Sie dem Modul einen Namen gegeben haben. Dann neu erstellen und Xcode erstellt die
-Swift.h
Header-Datei und Sie können importieren.Sie können die Moduldefinition und den Modulnamen in Ihren Projekteinstellungen festlegen.
quelle
Details: Objective-C-Projekt mit Swift 3-Code in Xcode 8.1
Aufgaben:
VOLLSTÄNDIGE PROBE
1. Objective-C-Klasse, die Swift-Enumeration verwendet
Erkennen Sie den Swift-Code im Objective-C-Code
In meinem Beispiel verwende ich SwiftCode.h, um Swift-Code in Objective-C zu erkennen. Diese Datei wird automatisch generiert (ich habe in einem Projekt keine physische Kopie dieser Header-Datei erstellt), und Sie können nur den Namen dieser Datei festlegen:
2. Schnelle Klasse, die Objective-C-Enumeration verwendet
Erkennen Sie den Objective-C-Code im Swift-Code
Sie müssen eine Bridging-Header-Datei erstellen. Wenn Sie eine Swift-Datei in ein Objective-C-Projekt oder eine Objective-C-Datei in ein Swift-Projekt einfügen, schlägt Xcode vor, einen Bridging-Header zu erstellen.
Sie können den Namen der Bridging-Header-Datei hier ändern:
Verwendung
Ergebnis
MEHR PROBEN
3. Rufen Sie die Swift-Klasse über den Objective-c-Code auf
Ergebnis
4. Rufen Sie die Objective-c-Klasse aus dem Swift-Code auf
Ergebnis
5. Verwenden Sie die Swift-Erweiterung im Objective-c-Code
6. Verwenden Sie die Objective-c-Erweiterung in Swift-Code
quelle
@objcMembers
vor der Klasse hinzufügen . Weil die@objc
Inferenz in Swift 4 zu Optimierungszwecken reduziert wurde. Beispielsweise wird eine Eigenschaft in einer von NSObject abgeleiteten Klasse standardmäßig nicht mehr auf @objc schließen (wie in Swift 3). Ich habe diese Informationen aus dieser Antwort erhalten .Ich hatte das gleiche Problem und es stellte sich heraus, dass spezielle Symbole im Modulnamen durch xcode ersetzt wurden (in meinem Fall waren Bindestriche Unterstriche). Aktivieren Sie in den Projekteinstellungen "Modulname", um den Modulnamen für Ihr Projekt zu finden. Verwenden Sie danach
ModuleName-Swift.h
das Modul oder benennen Sie es in den Einstellungen um.quelle
Die Datei wird automatisch erstellt (hier geht es um Xcode 6.3.2). Sie werden es jedoch nicht sehen, da es sich in Ihrem Ordner für abgeleitete Daten befindet. Nachdem Sie Ihre schnelle Klasse mit markiert haben
@objc
, kompilieren Sie sie und suchen Sie sieSwift.h
in Ihrem Ordner für abgeleitete Daten. Dort sollten Sie den Swift-Header finden.Ich hatte das Problem, dass Xcode meine
my-Project-Swift.h
inmy_Project-Swift.h
Xcode umbenannte"." "-"
Symbole usw. nicht mag . Mit der obigen Methode können Sie den Dateinamen finden und in eine Objective-C-Klasse importieren.quelle
#import "my_project-Swift.h"
und mein tatsächlicher Projektname istmy-project
Fügen Sie einfach #import "myProject-Swift.h" in die Datei .m oder .h ein
PS Sie finden "myProject-Swift.h" nicht im Dateiinspektor, es ist versteckt. Es wird aber automatisch von der App generiert.
quelle
@sig Antwort ist eine der besten, aber es hat bei mir mit dem alten Projekt nicht funktioniert (nicht neu!), ich brauchte einige Modifikationen. Nach vielen Variationen habe ich das Rezept für mich gefunden (mit XCode 7.2):
Der letzte Punkt (5) war entscheidend. Ich habe es nur in den zweiten Abschnitt ( Zielfeld) eingefügt , das Projektfeld sollte leer bleiben: Andernfalls wurde nicht die richtige "Project-Swift.h" -Datei für mich generiert (es enthielt keine schnellen Methoden).
quelle
Define Modules
sollte seinNo
??Es gibt zwei Bedingungen:
Zu diesem Zweck müssen Sie die folgenden Schritte ausführen:
Gehen Sie zu Build Settings und führen Sie die folgenden Schritte mit der Suche aus:
Bereinigen Sie danach Ihr Projekt und erstellen Sie es neu.
Verwenden Sie Ihre schnelle Datei in der Ziel-C-Datei.
In diesem Fall schreiben Sie zuerst "@objc" vor Ihre Klasse in eine schnelle Datei.
Schreiben Sie danach in Ihre Ziel-c-Datei Folgendes:
Verwenden Sie Ihre Ziel-C-Datei in einer schnellen Datei.
In diesem Fall schreiben Sie Folgendes in Ihre Header-Datei:
Ich hoffe, dies wird dir helfen.
quelle
Für Swift 5:
@objc
Schlüsselwort Ihrer Klasse und Ihren Methoden hinzupublic
Ihrer Klasse und Ihren Methoden ein Schlüsselwort hinzuNSObject
Fügen Sie
#import "MyProject-Swift.h"
Ihre Objective-C-Datei einquelle
In meinem Fall, abgesehen von diesen Schritten:
Ich habe benötigt , um die Klasse zu setzen Öffentlichkeit zu schaffen , um product-Swift.h - Datei:
quelle
Ich habe gerade festgestellt, dass das Hinzufügen eines Verzeichnisses mit schnellen Dateien zu einem Projekt nicht funktioniert. Sie müssen zuerst eine Gruppe für das Verzeichnis erstellen und dann die schnellen Dateien hinzufügen ...
quelle
Ich hatte das gleiche Problem und schließlich schien es, dass sie nicht an die gleichen Ziele gebunden waren. Die ObjC-Klasse ist an Target1 und Target2 angehängt, die Swift-Klasse ist nur an Target1 angehängt und in der ObjC-Klasse nicht sichtbar.
Hoffe das hilft jemandem.
quelle
Mein Problem war, dass ich feststeckte, nachdem xcode die Bridge-Datei erstellt hatte, aber dennoch eine Fehlermeldung im Header-Dateinamen MYPROJECTNAME-swift.h auftrat
1.Ich checke im Terminal ein und suche nach allen automatisch erstellten Swift Bridge-Dateien:
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -
Sie sehen, welcher Xcode erstellt wurde.
quelle
Wenn Sie dem Projekt neue Swift-Dateien hinzufügen, stellen Sie bitte sicher, dass Sie sie zu den richtigen Zielen hinzufügen. Stellen Sie sicher, dass jede schnelle Datei, die Sie verwenden möchten, die NSObject-Klasse erbt und in den Build-Einstellungen unter der Option ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES mit @ObjCMembers Change to YES versehen ist. Wechseln Sie in den Build-Einstellungen unter der Option DEFINES_MODULE zu YES.
quelle
Ich habe den gleichen Fehler:
myProjectModule-Swift.h
Datei nicht gefunden ", aber in meinem Fall lag der wahre Grund im falschen Bereitstellungsziel:"Swift
ist unter OS X vor 10.9 nicht verfügbar; BitteMACOSX_DEPLOYMENT_TARGET
auf 10.9 oder höher einstellen (derzeit ist es '10 .7 ') "Wenn ich also das Bereitstellungsziel auf 10.9 geändert habe, wurde das Projekt erfolgreich kompiliert.quelle
Mein Problem war, dass die automatische Generierung der Datei -swift.h eine Unterklasse von CustomDebugStringConvertible nicht verstehen konnte. Ich habe die Klasse geändert, um stattdessen eine Unterklasse von NSObject zu sein. Danach enthielt die Datei -swift.h die Klasse nun ordnungsgemäß.
quelle
Ich hatte Probleme damit, dass ich meinem Objective-C-Bridging-Header Klassen hinzufügte, und in den importierten Objective-C-Headern wurde versucht, den schnellen Header zu importieren. Das hat mir nicht gefallen.
In allen meinen Objective-C-Klassen, die Swift verwenden, aber auch überbrückt sind, bestand der Schlüssel darin, sicherzustellen, dass Sie Forward-Klassendeklarationen in den Headern verwenden, und dann die Datei "* -Swift.h" in die .m-Datei zu importieren.
quelle
Ich musste keine Einstellungen im Build ändern oder @obj zur Klasse hinzufügen.
Alles, was ich tun musste, war, einen Bridge-Header zu erstellen, der automatisch erstellt wurde, als ich Swift-Klassen in Objective-c-Projekt erstellte. Und dann musste ich einfach tun
Importieren Sie "Bedtime-Swift.h" <- in die Objective-C-Datei, die zur Verwendung dieser Swift-Datei benötigt wurde.
quelle
Nun, nachdem ich alle Kommentare gelesen und versucht und gelesen und erneut versucht hatte, gelang es mir, schnelle Klassen in mein Big obj-c-Projekt aufzunehmen. Also, danke für all die Hilfe. Ich wollte einen Tipp teilen, der mir half, den Prozess besser zu verstehen. Gehen Sie in der Klasse .m zur Importzeile des schnellen Zielnamens #import "myTargetName-Swift.h" und klicken Sie auf den Schlüssel:
Befehl + Mausklick -> Zur Definition springen
Dort können Sie die gesamte Übersetzung von schnell nach obj-c sehen und dort finden Sie die verschiedenen Funktionen, die in obj-c neu deklariert wurden. Ich hoffe, dieser Tipp hilft Ihnen genauso wie mir.
quelle
Verwenden von Swift-Klassen in Objective-C
Wenn Sie Code in ein App-Ziel importieren möchten (Mischen von Objective-C und Swift in einem Projekt), sollten Sie die nächste Importzeile verwenden
#import "<#YourProjectName#>-Swift.h"
, um Swift-Code für Objective-C-Code verfügbar zu machen [Mischen von Swift- und Objective-C-Code in einem Projekt]In diesem Beitrag werde ich beschreiben, wie die statische Swift-Bibliothek in Objective-C-Code importiert wird
Objective-C-Consumer -> Schnelle statische Bibliothek
Xcode Version 10.2.1
Erstellen Sie eine statische Swift-Bibliothek
Folgen Sie
Create Swift static library
mit den nächsten Ergänzungen:Stellen Sie die Swift-API bereit. So verwenden Sie Swifts Funktionen aus Objective-C [About]
Nach dem Erstellen sollten Sie eine
<product_name>-Swift.h
Datei finden, die sich inDerivedSources
[Datei nicht gefunden] befinden sollte.Objective-C-Consumer mit statischer Swift-Bibliothek
Drag and drop
die Binärdatei in das Xcode-Projekt [About]Link Library
[Undefinierte Symbole] [Link vs Embed]Hinzufügen
Library Search paths
[Bibliothek nicht gefunden für] [Rekursiver Pfad]Hinzufügen
Header Search Paths
[Modul nicht gefunden] [Rekursiver Pfad]Fügen Sie
.swift file
dem Objective-C-Projekt leer hinzu . [Undefinierte Symbole] Wenn Sie nach Xcode fragen, drücken Sie ErstellenBridging Header
(es wird erstelltmodule_name-Bridging-Header.h
) und richten Sie einen Pfad zu dieser Datei in einModul in den Objective-C-Clientcode importieren [Datei nicht gefunden] [Modulname]
Weitere Beispiele hier
quelle
XCode 11.3.1:
Wenn ich eine innere Swift-Klasse in einem Objektcode verwenden möchte, wird sie nicht für den Fehler "undefiniertes Symbol" kompiliert (für störende innere Klasse und äußere Klasse). Ich habe den generierten Header "-swift.h" überprüft und beide Klassen sind Dort.Nachdem ich es stundenlang versucht habe, konvertiere ich die innere Klasse in eine normale Klasse und sie wird kompiliert.Ich bereinige das Projekt, lösche den DerivedData-Ordner und es wird kompiliert.
quelle
@objc
vor der Deklaration der inneren Klasse hinzuzufügen ?Nachdem ich alles oben getan habe, habe ich immer noch Fehler. Mein Problem war schließlich, dass die benötigten Swift-Dateien aus irgendeinem Grund nicht zu den Bundle-Ressourcen hinzugefügt wurden.
Ich habe dies behoben, indem ich zu [MyTarget]> Build Phases> Copy Bundle Resources gegangen bin, dann auf die Plus-Schaltfläche geklickt und die Swift-Dateien hinzugefügt habe.
quelle