web-dev-qa-db-fra.com

Comment importer le code Swift vers Objective-C?

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 un moyen de l'importer?

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

Vous devez importer TargetName-Swift.h. Notez que c'est le nom de la 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 annotées avec @objc ou héritées de NSObject.

Considérations:

  • Si votre nom de cible contient des espaces, remplacez-les par des traits de soulignement (par exemple, My Project devient 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

388
Bill

Instructions sur le site Web Apple:

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

Sous Paramètres de construction, dans Conditionnement, assurez-vous que le paramètre module Définit pour cette cible de structure est défini sur Oui. Importez le code Swift de cette cible d'infrastructure dans n'importe quel fichier .m Objective-C de cette cible d'infrastructure à l'aide de cette syntaxe et en substituant les noms appropriés:

# import "ProductName-Swift.h"

Révision:

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

Les fichiers Swift de votre cible seront visibles dans les fichiers .b Objective-C 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 transférer la classe de déclaration 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.

enter image description here

139
Andrei Papancea

Voici ce qu'il faut faire:

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

  2. Créer un nouveau fichier .Swift

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

  4. Cliquez sur Build Settings

  5. Trouvez le barre de recherche et recherchez module de définition.

  6. Remplacez la valeur par Yes.

  7. Rechercher 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"

137
Sumit singh

Si vous utilisez Cocoapods et essayez d’utiliser un pod Swift dans un projet ObjC, vous pouvez simplement procéder comme suit:

@import <FrameworkName>;

enter image description here

33
KingPolygon

Accédez aux paramètres de construction de votre fichier 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é "Nom du module de produit" (celle dont dépend par défaut la propriété ci-dessus) varie selon que vous compilez pour test/debug/release/etc (comme c'est le cas dans mon cas), indiquez cette propriété indépendamment de celle variation en définissant un nom personnalisé.

17
Lukas Kalinski

L'importation du fichier Swift à l'intérieur de Objective-c peut être à l'origine de cette erreur, si import n'est pas correctement.

REMARQUE: Vous n'avez pas besoin d'importer des fichiers Swift en externe, il vous suffit d'importer un fichier qui gère les fichiers Swift.

Lorsque vous avez créé/copié le fichier Swift à l'intérieur du projet Objective-C . Il aurait créé un en-tête de pontage automatiquement.

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

enter image description here

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

Votre sera TargetName-Swift.h, Où TargetName diffère selon le nom de votre projet ou une autre cible que vous auriez pu ajouter et exécuter.

Comme ci-dessous, ma cible est KJExpandable, donc KJExpandable-Swift.h
enter image description here

12
Kiran Jasvanee

Première étape: -

Sélectionnez Cible du projet -> Paramètre de construction -> Recherche ('Définir') -> Définir le module mettre à jour la valeur Non à Oui

"Module défini": OUI.

"Toujours intégrer Swift Bibliothèques standard": YES.

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

enter image description here

Deuxième étape: -

Ajouter la classe de fichier Swift dans Objective C "Fichier" .h "comme ci-dessous

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Importer 'NomProjet (Votre Nom Projet) -Swift.h' dans le fichier ".m" d'Object C

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

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

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

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

#import <MyFramework/MyFramework-Swift.h>

MyFramework voici 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 construits (avant qu'un tel #import soit ajouté, de sorte que vous ayez au moins une construction réussie avec du code Swift dans la cible), vous devriez toujours voir le fichier MyFramework-Swift.h dans le répertoire Headers.

8
Misha Karpenko

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/

6
Prashant Bhayani

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"
4
Nitin Alabur

Recherchez "Nom de l’en-tête de l’interface générée Objective-C" dans les paramètres de construction de la cible que vous essayez de créer (supposons que c’est MyApp-Swift.h), puis importez la valeur de ce paramètre ( #import "MyApp-Swift.h") dans le fichier source où 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 My-App), dans la $(Swift_MODULE_NAME), tous les tirets seront remplacés par des traits de soulignement. Alors vous devrez ajouter #import "My_App-Swift.h".

4
Misha Karpenko

Si vous souhaitez utiliser le fichier Swift dans 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 fichier en-tête de pont
  3. Le générer
  4. Importez "ProjectName-Swift.h" dans votre contrôleur Objective-C (importez dans l'implémentation pas dans l'interface) (si votre projet a un espace entre les noms, utilisez le trait de soulignement "Project_Name-Swift.h")
  5. Vous pourrez accéder à votre cours Objective-C dans Swift.

Compilez-le et s'il génère une erreur de l'éditeur de liens, telle que: compilée avec la version plus récente de Swift language (3.0) par rapport aux fichiers précédents (2.0) pour l'architecture x86_64 ou armv 7

Faites encore un changement dans votre

  1. Xcode -> Projet -> Cible -> Paramètres de construction -> Utiliser l'héritage Swift Version du langage -> Oui

Construire et exécuter.

2
Dheeraj D

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

Dashes and underscores

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

vous verrez lorsque vous entrerez au clavier #import <et après, Xcode vous conseillera automatiquement.

0
Erhan Demirci