J'essaie d'intégrer du Swift
code dans mon application, mon application est écrite Objective-C
et j'ai ajouté une Swift
classe. J'ai fait tout ce qui est décrit ici . Mais mon problème est que Xcode
je n'ai pas créé le -Swift.h
fichier, seulement les en-têtes de pontage. Je l'ai donc créé, mais il est en fait vide. Je peux utiliser toutes mes classes ObjC dans Swift, mais je ne peux pas le faire vice versa. J'ai marqué ma classe rapide avec @objc
mais cela n'a pas aidé. Que puis-je faire maintenant?
EDIT: Apple dit: "Lorsque vous importez du code Swift dans Objective-C, vous comptez sur un Xcode-generated
fichier d'en-tête pour exposer ces fichiers à Objective-C. [...] Le nom de cet en-tête est le nom de votre module de produit suivi de l'ajout de" -Swift.h ”."
Maintenant, quand je veux importer ce fichier, cela donne une erreur:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
Voici mon fichier FBManager.swift:
@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
}
}
la source
YourProjectName-Swift.h
devrait être un fichier d'en-tête magique que Xcode crée automatiquement pour vous pendant la compilation (vous ne le verrez pas réellement dans le navigateur du projet). Essayez de supprimer celui que vous avez créé et ajoutez-le#import YourProjectName-Swift.h
aux fichiers dans lesquels vous souhaitez utiliser les classes Swift.myProjectModule
t-elle? Le-Swift.h
fichier doit commencer par le nom de votre application. Avez-vous un fichier se terminant par-Bridging-Header.h
? Vous devriez. Si c'est le cas, la première partie de ce fichier est le nom de votre projet. Combinez la première partie de ce nom de fichier avec-Swift.h
et c'est ce que vous devriez inclure.-Swift.h
sur mon Mac, et pourtant je peux l'inclure. Alors ne vous attardez pas à chercher un tel fichier. Assurez-vous simplement de le nommer correctement.#import <MyProjectName/MyProjectName-Swift.h>
Réponses:
J'ai passé environ 4 heures à essayer d'activer
Swift
dans monXcode
projet basé sur Objective-C. Monmyproject-Swift.h
fichier a été créé avec succès, mais monXcode
n'a pas été vuSwift-classes
. J'ai donc décidé de créer un nouveauXcode
projet basé sur Objc et finalement, j'ai trouvé la bonne réponse! J'espère que ce message aidera quelqu'un :-)Intégration Swift étape par étape pour un projet basé sur Xcode Objc:
*.swift
fichier (dans Xcode) ou ajoutez-le à l'aide du Finder.Objective-C bridging header
quand Xcode vous le demande.Implémentez votre classe Swift:
Ouvrez les paramètres de construction et vérifiez ces paramètres:
YES
myproject
YES
myproject-Swift.h
$(SRCROOT)/myproject-Bridging-Header.h
Importez l'en-tête de l'interface Swift dans votre fichier * .m.
la source
"myproject-Swift.h"
, il me semble donc que cela ne fonctionne pas. Apparemment, ce fichier n'est pas visible dans le navigateur de projet.#import "myproject-Swift.h"
.Ne créez pas le fichier d'en-tête vous-même. Supprimez celui que vous avez créé.
Assurez-vous que vos classes Swift sont étiquetées
@objc
ou héritent d'une classe qui dérive (directement ou indirectement) deNSObject
.Xcode ne générera pas le fichier si vous avez des erreurs de compilation dans votre projet - assurez-vous que votre projet se construit correctement.
la source
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u
pour voir si le fichier a été créé avec un nom inattendu comme pour moi. :)Autorisez Xcode à faire son travail, n'ajoutez / créez pas l'en-tête Swift manuellement. Ajoutez simplement @objc avant votre classe Swift ex.
Dans la configuration de votre projet, recherchez les drapeaux ci-dessous et changez-le en OUI (projet et cible)
Ensuite, nettoyez le projet et générez une fois, après la réussite de la génération (il devrait probablement) importer le fichier d'en-tête ci-dessous dans votre fichier .m de classe c-objective
Boooom!
la source
Basic
àAll
dans la barre supérieure.Embedded Content Contains Swift
a été remplacé parAlways Embed Swift Standard Libraries
avec Xcode 8: stackoverflow.com/questions/38792650/…Également probablement utile pour ceux d'entre vous qui ont un objectif Framework :
L' instruction d'importation du fichier d'en-tête généré automatiquement est un peu différente des cibles d'application. En plus des autres choses mentionnées dans d'autres réponses, utilisez
au lieu de
selon la documentation d'Apple sur Mix & Match pour les cibles du framework.
la source
Assurez-vous que votre projet définit un module et que vous avez donné un nom au module. Reconstruisez ensuite, et Xcode créera le
-Swift.h
fichier d'en-tête et vous pourrez l'importer.Vous pouvez définir la définition et le nom du module dans les paramètres de votre projet.
la source
Détails: Projet Objective-C avec code Swift 3 dans Xcode 8.1
Tâches:
ÉCHANTILLON COMPLET
1. Classe Objective-C qui utilise l'énumération Swift
Détecter le code Swift dans le code Objective-C
Dans mon exemple, j'utilise SwiftCode.h pour détecter le code Swift dans Objective-C. Ce fichier est généré automatiquement (je n'ai pas créé de copie physique de ce fichier d'en-tête dans un projet), et vous ne pouvez définir que le nom de ce fichier:
2. Classe Swift qui utilise l'énumération Objective-C
Détecter le code Objective-C dans le code Swift
Vous devez créer un fichier d'en-tête de pontage. Lorsque vous ajoutez un fichier Swift dans le projet Objective-C ou un fichier Objective-C dans le projet Swift, Xcode vous proposera de créer un en-tête de pontage.
Vous pouvez modifier le nom du fichier d'en-tête de pontage ici:
Usage
Résultat
PLUS D'ÉCHANTILLONS
3. Appelez la classe Swift à partir du code Objective-c
Résultat
4. Appelez la classe Objective-c à partir du code Swift
Résultat
5. Utilisez l'extension Swift dans le code Objective-c
6. Utilisez l'extension Objective-c dans le code rapide
la source
@objcMembers
devant la classe. Parce que l'@objc
inférence a été réduite dans Swift 4 à des fins d'optimisation. Par exemple, une propriété dans une classe dérivée de NSObject ne déduira plus @objc par défaut (comme dans Swift 3). J'ai obtenu cette information de cette réponse .J'ai eu le même problème et il s'est avéré que les symboles spéciaux dans le nom du module sont remplacés par xcode (dans mon cas, les tirets ont fini par être des traits de soulignement). Dans les paramètres du projet, cochez "nom du module" pour trouver le nom du module pour votre projet. Après cela, utilisez
ModuleName-Swift.h
ou renommez le module dans les paramètres.la source
Le fichier est créé automatiquement (en parlant de Xcode 6.3.2 ici). Mais vous ne le verrez pas, car il se trouve dans votre dossier de données dérivées. Après avoir marqué votre classe rapide avec
@objc
, compilez, puis recherchezSwift.h
dans votre dossier de données dérivées. Vous devriez y trouver l'en-tête Swift.J'ai eu le problème, que Xcode renommé mon
my-Project-Swift.h
àmy_Project-Swift.h
Xcode ne fonctionne pas comme"." "-"
symboles etc.. Avec la méthode ci-dessus, vous pouvez trouver le nom de fichier et l'importer dans une classe Objective-C.la source
#import "my_project-Swift.h"
et mon nom de projet réel estmy-project
Il suffit d'inclure #import "myProject-Swift.h" dans le fichier .m ou .h
PS Vous ne trouverez pas "myProject-Swift.h" dans l'inspecteur de fichiers, il est caché. Mais il est généré automatiquement par l'application.
la source
La réponse @sig est l'une des meilleures, cependant, cela ne fonctionnait pas pour moi avec l'ancien projet (pas nouveau!), j'avais besoin de quelques modifications. Après beaucoup de variations, j'ai trouvé la recette pour moi (en utilisant XCode 7.2):
Le dernier point (5) était crucial. Je ne l'ai mis que dans la deuxième section (champ Targets), le champ Project doit être laissé vide: sinon, il n'a pas généré le bon fichier "Project-Swift.h" pour moi (il n'incluait pas les méthodes swift).
la source
Define Modules
devrait êtreNo
??Il y a deux conditions,
Donc, à cette fin, vous devez suivre ces étapes:
Accédez aux paramètres de construction et effectuez les étapes ci-dessous avec la recherche,
Après cela, nettoyez et reconstruisez votre projet.
Utilisez votre fichier rapide dans le fichier objectif c.
Dans ce cas, écrivez d'abord "@objc" avant votre classe dans un fichier swift.
Après cela, dans votre fichier objectif c, écrivez ceci,
Utilisez votre fichier objectif c dans un fichier rapide.
Dans ce cas, dans votre fichier d'en-tête, écrivez ceci,
J'espère que cela t'aidera.
la source
Pour Swift 5:
@objc
mot - clé à votre classe et à vos méthodespublic
mot-clé à votre classe et à vos méthodesNSObject
Mettez
#import "MyProject-Swift.h"
dans votre fichier Objective-Cla source
Dans mon cas, en dehors de ces étapes:
J'ai dû mettre la classe en public afin de créer le fichier productName-Swift.h :
la source
Je viens de découvrir que l'ajout d'un répertoire de fichiers rapides à un projet ne fonctionnera pas. Vous devez d'abord créer un groupe pour le répertoire, puis ajouter les fichiers rapides ...
la source
J'ai eu le même problème et finalement il est apparu qu'ils n'étaient pas attachés aux mêmes cibles. La classe ObjC est attachée à Target1 et Target2, la classe Swift n'est attachée qu'à Target1 et n'est pas visible à l'intérieur de la classe ObjC.
J'espère que cela aide quelqu'un.
la source
mon problème était que je suis resté coincé après que xcode ait créé le fichier bridge mais j'ai quand même eu une erreur dans le nom du fichier d'en-tête MYPROJECTNAME-swift.h
1.Je vérifie dans le terminal et recherche tous les fichiers de pont rapide créés automatiquement:
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -
vous voyez ce que xcode a créé.
la source
Lorsque vous ajoutez de nouveaux fichiers Swift au projet, assurez-vous de les ajouter aux cibles correctes. Veuillez vous assurer que chaque fichier Swift que vous allez utiliser hérite de la classe NSObject et annoté avec @ObjCMembers Changez en YES dans les paramètres de construction sous l'option ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Passez à OUI dans les paramètres de construction sous l'option DEFINES_MODULE.
la source
J'ai la même erreur:
myProjectModule-Swift.h
fichier introuvable ", mais, dans mon cas, la vraie raison était dans une cible de déploiement incorrecte:"Swift
n'est pas disponible sur OS X avant 10.9; veuillez définirMACOSX_DEPLOYMENT_TARGET
à 10,9 ou plus tard (actuellement, il est '10,7 ') "donc, quand j'ai changé la cible de déploiement en 10,9 - le projet a été compilé avec succès.la source
Mon problème était que la génération automatique du fichier -swift.h n'était pas en mesure de comprendre une sous-classe de CustomDebugStringConvertible. J'ai plutôt changé de classe pour devenir une sous-classe de NSObject. Après cela, le fichier -swift.h incluait désormais correctement la classe.
la source
J'ai eu des problèmes en ce que j'ajouterais des classes à mon en-tête de pontage d'objectif-c, et dans les en-têtes d'objectif-c qui ont été importés, ils essayaient d'importer l'en-tête rapide. Ça n'aimait pas ça.
Donc, dans toutes mes classes objective-c qui utilisent swift, mais sont également pontées, la clé était de vous assurer que vous utilisez des déclarations de classe avancées dans les en-têtes, puis importez le fichier "* -Swift.h" dans le fichier .m.
la source
Je n'ai pas eu à modifier les paramètres de la build ni à ajouter @obj à la classe.
Tout ce que j'avais à faire était de créer un en-tête de pont qui était automatiquement créé lorsque je créais des classes Swift dans le projet Objective-c. Et puis je devais juste faire
importer "Bedtime-Swift.h" <- à l'intérieur du fichier objective-c qui devait utiliser ce fichier swift.
la source
eh bien, après avoir lu tous les commentaires et essayé et lu et réessayé, j'ai réussi à inclure des cours rapides dans mon projet Big obj-c. Alors, merci pour toute l'aide. Je voulais partager un conseil qui m'a aidé à mieux comprendre le processus. Dans la classe .m, est allé à la ligne d'importation du nom cible rapide #import "myTargetName-Swift.h" et a cliqué sur la clé:
commande + clic de souris -> Aller à la définition
Là, vous pouvez voir toute la traduction de swift en obj-c et vous trouverez les différentes fonctions re-déclarées dans obj-c. J'espère que cette astuce vous aidera autant qu'elle m'a aidé.
la source
Utilisation de classes Swift dans Objective-C
Si vous allez importer du code dans une cible d'application (mélanger Objective-C et Swift dans un projet), vous devez utiliser la ligne d'importation suivante
#import "<#YourProjectName#>-Swift.h"
pour exposer le code Swift au code Objective-C [Mélanger le code Swift et Objective-C dans un projet]Dans cet article, je décrirai comment importer une bibliothèque statique Swift dans du code Objective-C
Consommateur Objective-C -> Bibliothèque statique Swift
Xcode version 10.2.1
Créer une bibliothèque statique Swift
Suivre
Create Swift static library
avec les prochains ajouts:Exposez l'API Swift. Pour utiliser les fonctions de Swift depuis Objective-C [À propos]
Après la construction, vous devriez trouver un
<product_name>-Swift.h
fichier qui devrait se trouver dansDerivedSources
[Fichier introuvable]Consommateur Objective-C avec bibliothèque statique Swift
Drag and drop
le binaire dans le projet Xcode [À propos]Link Library
[Symboles non définis] [Lien vs intégration]Ajouter
Library Search paths
[Bibliothèque introuvable pour] [Chemin récursif]Ajouter
Header Search Paths
[Module introuvable] [Chemin récursif]Ajoutez vide
.swift file
au projet Objective-C. [Symboles non définis] Lorsque Xcode demande, appuyez sur CréerBridging Header
(il créeramodule_name-Bridging-Header.h
) et configurez un chemin d'accès à ce fichier dansImporter le module dans le code client Objective-C [Fichier introuvable] [nom_module]
Plus d'exemples ici
la source
XCode 11.3.1:
Lorsque je veux utiliser une classe interne Swift dans un code objc, il ne compile pas pour l'erreur "symbole non défini" (pour la classe interne et la classe externe), j'ai vérifié l'en-tête "-swift.h" généré et les deux classes sont Là.Après avoir essayé pendant des heures, je convertis la classe interne en classe normale et elle se compile.Je nettoie le projet, supprime le dossier DerivedData et il compile.
la source
@objc
avant la déclaration de la classe interne?Après avoir fait tout ce qui précède, j'ai encore des erreurs. Mon problème a fini par être que les fichiers Swift dont j'avais besoin n'étaient pas ajoutés aux ressources du bundle pour une raison quelconque.
J'ai corrigé cela en allant dans [MyTarget]> Build Phases> Copy Bundle Resources, puis j'ai cliqué sur le bouton plus et ajouté les fichiers Swift.
la source