Comment importer du code Swift dans Objective-C?

281

J'ai écrit une bibliothèque dans Swift et je n'ai pas pu l'importer dans mon projet actuel, écrit en Objective-C.

Existe-t-il des moyens de l'importer?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Viktor Radchenko
la source
9
j'adore ce projet!
SleepsOnNewspapers

Réponses:

430

Vous devez importer TargetName-Swift.h. Notez que c'est le nom cible - les autres réponses font l'erreur d'utiliser le nom de la classe.

Ce fichier unique est un en-tête généré automatiquement qui définit les interfaces Objective-C pour toutes les classes Swift de votre projet qui sont annotées @objcou héritées de NSObject.

Considérations:

  • Si votre nom cible contient des espaces, remplacez-les par des traits de soulignement (par exemple, My Projectdevient My_Project-Swift.h)

  • Si votre cible est un framework, vous devez importer <TargetName/TargetName-Swift.h>

  • Assurez-vous que votre fichier Swift est membre de la cible

Facture
la source
5
Notez que si vous essayez d'utiliser le nom de fichier Swift dans votre importation, vous obtiendrez l'erreur "Expected ';' après le déclarant de niveau supérieur ". dans votre fichier Swift après "importation Foundation".
louielouie
8
EDIT: Remarque: pour que cela fonctionne, un nom de module de projet DOIT être défini. Voir: stackoverflow.com/a/24064015/2085743
Ruben Martinez Jr.
7
Je voudrais juste ajouter une note que si le nom de votre projet a un espace blanc ou un caractère spécial, vous devez les remplacer par des traits de soulignement, comme "Mon application" serait "My_App-Swift.h"
Hola Soy Edu Feliz Navidad Navidad
84
Pourquoi est-ce si difficile et si mal documenté?
uchuugaka
3
@lelelo Non, ce fichier est l'opposé de celui-ci. L'en-tête de pontage est écrit par le développeur et vous permet d'apporter des symboles Objective-C et C dans votre code Swift. Le fichier Target-Swift.h est généré automatiquement et permet à votre code Objective-C / C d'accéder aux symboles Swift.
Bill
154

Instructions du site Web d'Apple:

Pour importer du code Swift dans Objective-C à partir du même framework

Sous Paramètres de génération , dans Empaquetage , assurez-vous que le paramètre Définit le module pour cette cible de structure est défini sur Oui . Importez le code Swift de cette cible de framework dans n'importe quel fichier Objective-C .m au sein de cette cible de framework en utilisant cette syntaxe et en remplaçant les noms appropriés:

#import "ProductName-Swift.h"

Révision:

Vous ne pouvez importer que "ProductName-Swift.h" dans des fichiers .m.

Les fichiers Swift de votre cible seront visibles dans les fichiers Objective-C .m contenant cette instruction d'importation.

Pour éviter les références cycliques, n'importez pas Swift dans un fichier d'en-tête Objective-C. Au lieu de cela, vous pouvez transmettre une classe Swift pour l'utiliser dans un en-tête Objective-C. Notez que vous ne pouvez pas sous-classer une classe Swift dans Objective-C.

entrez la description de l'image ici

Andrei Papancea
la source
2
Seule l'importation de "ProductName-Swift.h" dans des fichiers .m m'a aidé. L'ajout de la même chose dans le fichier .pch donnait "Impossible de trouver la déclaration de protocole pour 'CLLocationManagerDelegate'; vouliez-vous dire 'NSLayoutManagerDelegate'?"
Alphonse R. Dsouza
@AJit, ce n'est pas directement, la documentation le dit. Le moyen le plus simple consiste à créer une classe Objective-C qui se traduit dans un format que Objective-C ++ comprend. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Alejandro Iván
1
Notez que vous devez dériver de NSObject!!! vous ne pouvez pas simplement déclarer un class Blah en un rien de temps et le faire fonctionner. ça doit êtreclass Blah : NSObject
David T.
Cela vaut la peine de lire cette réponse dans certains cas: stackoverflow.com/questions/26328034/… Selon ce que vous faites: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333
Et si vous voulez importer une extension Swift?
Ricardo
150

Voici quoi faire:

  1. Créer un nouveau projet dans Objective-C

  2. Créer un nouveau .swiftfichier  

    • Une fenêtre contextuelle apparaîtra et vous demandera "Voulez-vous configurer un en-tête de pontage Objective-C" .
    • Choisissez oui .
  3. Cliquez sur votre fichier de projet Xcode

  4. Cliquez sur Build Settings

  5. Recherchez la barre de recherche et recherchez le module Defines .

  6. Modifiez la valeur sur Oui .

  7. Rechercher le nom du module de produit .

  8. Remplacez la valeur par le nom de votre projet.

  9. Dans Délégué d'application, ajoutez les éléments suivants: #import "YourProjectName-Swift.h"


Remarque: chaque fois que vous souhaitez utiliser votre fichier Swift, vous devez importer la ligne suivante:

#import "YourProjectName-Swift.h"

Sumit singh
la source
1
Modification de la valeur de Defines moduledans Build settingsà Yesce que les choses fixé pour moi!
Zakaria Braksa
Le contenu intégré contient Swift: OUI UTILISEZ
LE
4
bonne réponse mais les étapes 7 à 8 ne sont pas nécessaires dans Xcode 7.3.1 et supérieur
Sam B
A travaillé pour moi! Merci.
itsdamslife du
1
Je veux juste ajouter que YourProjectNamedans #import "YourProjectName-Swift.h"sera le nom du projet de l'étape 8. Utile si le nom de votre projet contient des caractères spéciaux et que vous ne savez pas exactement comment vous devez le formater.
Chuck Boris
40

Si vous utilisez des Cocoapods et essayez d'utiliser un pod Swift dans un projet ObjC, vous pouvez simplement faire ce qui suit:

@import <FrameworkName>;

entrez la description de l'image ici

KingPolygon
la source
1
Merci beaucoup! tu m'as sauvé la journée.
Esha
Cela fonctionne comme un charme si nous avons installé une bibliothèque rapide via Cocoapods. A voté !!!
NSPratik
21

Accédez aux paramètres de génération dans votre fichier de projet et recherchez «Nom d'en-tête d'interface généré par Objective-C . La valeur de cette propriété est le nom que vous devez inclure.

Si votre propriété "Product Module Name" (celle dont dépend la propriété ci-dessus par défaut) varie selon que vous compilez pour test / debug / release / etc (comme c'est le cas dans mon cas), alors rendez cette propriété indépendante de celle variation en définissant un nom personnalisé.

Lukas Kalinski
la source
15

L'importation d'un Swiftfichier à l'intérieur Objective-cpeut provoquer cette erreur, si elle ne fonctionne pas importcorrectement.

REMARQUE: vous n'avez pas besoin d'importer des fichiers Swift en externe, il vous suffit d'importer un fichier qui prend en charge les fichiers Swift.

Lorsque vous avez créé / copié un fichier Swift dans le projet Objective-C . Il aurait créé automatiquement un en-tête de pontage.

Vérifiez Objective-C Generated Interface Header Nameà Targets -> Build Settings.

entrez la description de l'image ici

Sur la base de ce qui précède, je vais importer KJExpandable-Swift.htel quel.

Le vôtre sera TargetName-Swift.h, Où TargetNamediffère selon le nom de votre projet ou une autre cible que vous pourriez avoir ajoutée et exécutée dessus.

Comme ci-dessous mon objectif est KJExpandable, il est doncKJExpandable-Swift.h
entrez la description de l'image ici

Kiran Jasvanee
la source
12

Premier pas:-

Sélectionnez la cible du projet -> Paramètres de construction -> Rechercher ('Définir') -> Définir la valeur de mise à jour du module Non à Oui

"Définit le module": OUI .

"Toujours intégrer des bibliothèques standard Swift": OUI .

"Installer l'en-tête de compatibilité Objective-C": OUI .

entrez la description de l'image ici

Deuxième étape:-

Ajouter une classe de fichier Swift dans le fichier Objective C ".h" comme ci-dessous

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Importez 'ProjectName (votre nom de projet) -Swift.h' dans le fichier Objective C ".m"

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

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

#import "ProjectName-Swift.h"
Darshan Panchal
la source
La déclaration directe (@class) de la classe est un très bon point! Merci!
Philipp Otto
10

Il y a une mise en garde si vous importez du code Swift dans vos fichiers Objective-C dans le même cadre. Vous devez le faire en spécifiant le nom du cadre et les crochets:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkvoici le paramètre de construction "Product Module Name" ( PRODUCT_NAME = MyFramework).

Ajouter simplement #import "MyFramework-Swift.h"ne fonctionnera pas. Si vous vérifiez le répertoire des produits créés (avant qu'un tel #importfichier ne soit ajouté, vous avez donc eu au moins une génération réussie avec du code Swift dans la cible), vous devriez toujours voir le fichier MyFramework-Swift.hdans le Headersrépertoire.

Misha Karpenko
la source
8

Si vous avez créé un projet dans Swift 4, puis ajouté des fichiers Objective-C, procédez comme suit:

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

Référence: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/

Prashant Bhayani
la source
Dans mon code, après l'avoir mis à jour vers Swift 4.2 à partir de swift 3. Cela ne fonctionne pas
SNarula
Quelle erreur obtenez vous? J'ai utilisé le code ci-dessus dans Swift4.2 et son bon fonctionnement.
Prashant Bhayani
OK, c'est bien.
Prashant Bhayani
4

Consultez les notes préliminaires sur Swift et Objective C dans le même projet

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

Vous devriez importer

#import "SCLAlertView-Swift.h"
Nitin Alabur
la source
3
M'a montré cette erreur: fichier 'SCLAlertView-Swift.h' introuvable.
Viktor Radchenko
2
Doit être le nom du projet, pas le nom du fichier - voir ma réponse.
Bill
1
Merci pour le lien de documentation. C'était utile comme référence.
louielouie
2
Pour citer le lien fourni: The name of this header is your product module name followed by adding "-Swift.h".ce n'est donc pas le nom de la classe comme vous l'avez écrit, mais le nom de votre module de produit et qui s'occupe d'importer tous les fichiers rapides, pas seulement un spécifique
Chris
4

Recherchez «Nom d'en-tête d'interface généré par Objective-C» dans les paramètres de construction de la cible que vous essayez de construire (disons que c'est MyApp-Swift.h) et importez la valeur de ce paramètre ( #import "MyApp-Swift.h") dans le fichier source auquel vous essayez d'accéder. vos API Swift.

La valeur par défaut de ce champ est $(SWIFT_MODULE_NAME)-Swift.h. Vous pouvez le voir si vous double-cliquez dans le champ de valeur du paramètre "Nom d'en-tête d'interface généré par Objective-C".

De plus, si vous avez des tirets dans le nom de votre module (disons que c'est le cas My-App), $(SWIFT_MODULE_NAME)tous les tirets seront remplacés par des traits de soulignement. Alors, vous devrez ajouter #import "My_App-Swift.h".

Misha Karpenko
la source
Mieux que approuvé. Les tirets ont perdu 20 minutes, je ne reviendrai jamais haha.
Roi Mulia
3

Si vous souhaitez utiliser le fichier Swift dans la classe Objective-C , à partir de Xcode 8, vous pouvez suivre les étapes ci-dessous:

Si vous avez créé le projet dans Objective-C:

  1. Créer un nouveau fichier Swift
  2. Xcode demandera automatiquement le fichier Bridge-Header
  3. Générez-le
  4. Importez "ProjectName-Swift.h" dans votre contrôleur Objective-C (importez dans l'implémentation pas dans l'interface) (si votre projet a de l'espace entre les noms, utilisez le trait de soulignement "Project_Name-Swift.h")
  5. Vous pourrez accéder à votre classe Objective-C dans Swift.

Compilez-le et s'il générera une erreur de l'éditeur de liens comme: compilé avec une version plus récente du langage Swift (3.0) que les fichiers précédents (2.0) pour l'architecture x86_64 ou armv 7

Faites encore un changement dans votre

  1. Xcode -> Project -> Target -> Build Settings -> Use Legacy Swift Language Version -> Yes

Construisez et exécutez.

Dheeraj D
la source
1
je ne reçois pas cette option d'utilisation de la version de langue swift héritée
rd_
1

Soyez prudent avec les tirets et les traits de soulignement, ils peuvent être mélangés et votre nom de projet et votre nom cible ne seront pas les mêmes que SWIFT_MODULE_NAME.

Tirets et traits de soulignement

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

vous verrez quand vous entrez à partir du clavier #import <et après automatiquement Xcode vous conseillera.

Erhan Demirci
la source
-1

Recherchez le fichier .PCH dans le projet. puis ajoutez #import "YourProjectName-Swift.h"Cela importera les en-têtes de classe. Pour que vous n'ayez pas à importer dans un fichier spécifique.

#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.
la source