Comment puis-je importer du code Swift dans 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.

Y a-t-il des moyens de l’importer?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found 

    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 @objc de NSObject .

    Considérations:

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

    • Si votre cible est un framework, vous devez importer

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

    Instructions du site Apple:

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

    Sous Paramètres de génération , dans Emballage , assurez-vous que le paramètre Définir le module pour cette cible de structure est défini sur Oui . Importez le code Swift à partir de cette cible dans un fichier Object-C .m de cette cible 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 les 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 transférer 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.

    entrer la description de l'image ici

    Voici ce qu’il faut faire:

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

    2. Créer un nouveau fichier .swift

      • Une fenêtre contextuelle apparaîtra et 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 Defines Module .

    6. Changer la valeur à 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 ce qui suit: #import "YourProjectName-Swift.h"


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

    #import "YourProjectName-Swift.h"

    Si vous utilisez Cocoapods et essayez d’utiliser un pod Swift dans un projet ObjC, vous pouvez simplement effectuer les opérations suivantes:

    @import ;

    entrer la description de l'image ici

    Allez dans les parameters de construction dans votre fichier de projet et recherchez “Nom d’en-tête d’interface générée 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 la propriété ci-dessus) varie selon que vous comstackz pour test / debug / release / etc (comme c’est le cas dans mon cas), rendez cette propriété indépendante de cette propriété. variation en définissant un nom personnalisé.

    L’importation du fichier Swift dans Objective-c peut provoquer cette erreur si elle ne l’ import pas correctement.

    REMARQUE: Vous n’êtes pas obligé d’importer des fichiers Swift en externe, il vous suffit d’importer un fichier qui prend en charge les fichiers rapides.

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

    Vérifiez le nom de l’en Objective-C Generated Interface Header Name dans Targets -> Build Settings .

    entrer la description de l'image ici

    Basé sur ci-dessus, je vais importer KJExpandable-Swift.h tel quel.

    Votre nom sera TargetName-Swift.h , où TargetName diffère en fonction du nom de votre projet ou d’une autre cible que vous avez pu append et exécuter.

    Comme ci-dessous ma cible est KJExpandable , donc c’est KJExpandable-Swift.h
    entrer la description de l'image ici

    Premier pas:-

    Sélectionnez la cible du projet -> Paramètre de construction -> Recherche (‘Définir’) -> Définir la valeur de mise à jour du module Non à Oui

    “Définit le module”: OUI .

    “Toujours incorporer les bibliothèques standard Swift”: OUI .

    “Installer l’en-tête de compatibilité Objective-C”: OUI .

    entrer la description de l'image ici

    Deuxième étape:-

    Ajouter la classe de fichier Swift dans le fichier Objective C “.h” comme ci-dessous

     #import  @class TestViewController(Swift File); @interface TestViewController(Objective C File) : UIViewController @end 

    Importer “ProjectName (votre nom de projet) -Swift.h” dans le fichier “.m” d’Objectif C

     //TestViewController.m #import "TestViewController.h" /*import ProjectName-Swift.h file to access Swift file here*/ #import "ProjectName-Swift.h" 

    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 est le paramètre de construction “Nom du module de produit” ( PRODUCT_NAME = MyFramework ).

    #import "MyFramework-Swift.h" simplement #import "MyFramework-Swift.h" ne fonctionnera pas. Si vous vérifiez le répertoire des produits construits (avant l’ajout d’un tel #import , vous avez au moins une génération réussie avec du code Swift dans la cible), alors vous devriez toujours voir le fichier MyFramework-Swift.h dans les en- Headers annuaire.

    Consultez les notes de pré-publication 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" 

    Recherchez “Nom d’en-tête d’interface généré par Objective-C” dans les parameters de génération de la cible que vous essayez de générer (disons MyApp-Swift.h ) et 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 My-App ), alors dans $(SWIFT_MODULE_NAME) tous les tirets seront remplacés par des tirets bas. Donc, vous devrez append #import "My_App-Swift.h" .

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

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

    1. Créer un nouveau fichier Swift
    2. Xcode demandera automatiquement le fichier Bridge-Header
    3. Le générer
    4. Importer “ProjectName-Swift.h” dans votre contrôleur Objective-C (importation dans l’implémentation pas dans l’interface) (si votre projet a un espace entre son nom, utilisez le soulignement “Project_Name-Swift.h”)
    5. Vous pourrez accéder à votre classe Objective-C dans Swift.

    Comstackz-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 un autre changement dans votre

    1. Xcode -> Projet -> Cible -> Paramètres de construction -> Utiliser la version de langue Swift héritée -> Oui

    Construire et exécuter.

    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  #import  #import "YourProjectName-Swift.h" #endif 

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

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

    }

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