web-dev-qa-db-fra.com

Cadre d'importation dans Swift Project, Xcode

J'essaie d'importer myFramework dans un projet. J'ai ajouté myFramework dans Build Phases-> Link Binary With Libraries.

Objective-c fonctionne:

#import <UIKit/UIKit.h>
#import <myFramework/myFramework.h>

Mais avec Swift, je reçois un No such module myFramework Erreur:

import UIKit
import myFramework

Selon le documentation Swift :

Importation de cadres externes

Vous pouvez importer des frameworks externes ayant une base de code Objective-C pure, une base de code pure Swift, ou une base de code multilingue. Le processus d'importation d'un framework externe est identique, que le framework soit écrit ou non. Dans une seule langue ou contient des fichiers des deux langues Lorsque vous importez un cadre externe, assurez-vous que le paramètre de construction du module Defines pour le cadre que vous importez est défini sur Oui.

Vous pouvez importer une structure dans n'importe quel fichier Swift d'une cible différente, à l'aide de la syntaxe suivante:

Rapide

import FrameworkName

Vous pouvez importer une structure dans n'importe quel fichier .m Objective-C appartenant à une cible différente en utilisant la syntaxe suivante:

OBJECTIF-C

@import FrameworkName;

J'ai créé myFramework à l'aide de Xcode 5. Xcode 5 ne dispose pas d'un paramètre de construction "Defines Module".

Où est le problème?

47
phnmnn

Si je vous comprends bien, vous n’avez pas de cible de construction distincte pour votre framework (vous l’avez déjà construite avec XCode 5) et vous l’avez inclus dans la cible de construction de votre projet.

La partie de la documentation à laquelle vous faites référence concerne les cadres à l'intérieur de différents cibles. Puisque votre cadre est dans la cible du projet, cette partie de la documentation ne s'applique pas ici.

Dans votre cas, vous ne pouvez pas importer le framework dans votre fichier Swift. C'est pourquoi vous obtenez le message d'erreur "Aucun module tel myFramework" . myFramework n'est pas un module - il fait partie du module de votre projet (déterminé par défaut par le nom de votre produit). En tant que telles, les classes de votre framework doivent être accessibles.

Cependant, votre cadre est écrit en Objective-C. Vous devez donc importer les classes Swift faisant face à votre en-tête de pontage comme décrit ici .

Notez que cela n’a rien à voir avec l’importation Swift d’un module. La directive import du fichier d'en-tête bridging invite simplement le compilateur à "traduire" les fichiers d'en-tête Objective-C en syntaxe Swift et rend l'en-tête public visible à Swift.

Alors, que devriez-vous faire maintenant?

  • Commencez par importer les fichiers d’en-tête qui vous intéressent dans le bridging-header. Vous devez uniquement importer les en-têtes avec lesquels vous allez interagir dans Swift.

  • Essayez de compiler votre projet à cette étape. Si XCode ne peut pas trouver les fichiers d’en-tête du cadre, votre problème n’est probablement pas lié à Swift ni à XCode 6, mais à l’inclusion des cadres en général.

  • Après cela, essayez d’instancier une classe que vous avez importée dans l’en-tête bridging, peut-être dans votre AppDelegate.Swift. La saisie automatique XCode devrait vous proposer les noms de type.

J'espère que cela t'aides.

21
mic

Sur Swift:

Créer un cadre: -

  1. Démarrer Xcode -> Créer un nouveau projet Xcode -> iOS -> Framework & Library -> Cocoa Touch Framework -> Nommer le framework (par exemple sampleCocoaFramework) -> Créer.

  2. Définir la cible -> Général -> Informations de déploiement -> Cible de déploiement.

  3. Ajoutez une classe publique: Fichier -> Nouveau fichier -> iOS -> Swift Fichier -> Nommez-le (par exemple openCocoaClass) -> Créer.

  4. Ajoutez maintenant du code à l'openCocoaClass.Swift.

    import Foundation
    
    public class openCocoaClass {
    
        public init() {
    
        }
    
        public var samplePublicVariable = "samplePublicVariable @ openCocoaClass"
    
        public func samplePublicFunction()
        {
            print("samplePublicFunction @ openCocoaClass")
        }          
    

    }

  5. Nettoyer le projet: Produit -> Nettoyer

  6. Configurez les paramètres du schéma: Produit -> Schéma -> Éditer le schéma -> Exécuter -> Configurer la construction -> Valider.

  7. Construisez le framework: Produit -> Build.

  8. Exportez le cadre: Produits -> Sélectionnez le cadre -> Identité et type -> Chemin complet -> Cadre publié.

Ajout d'un cadre au projet: -

  1. Démarrez un projet Xcode et nommez-le (ex. CocoaFrameworkTest).

  2. Glissez-déposez sampleCocoaFramework.framework dans le dossier de projet de CocoaFrameworkTest.

  3. Cible -> Général -> Binaires incorporés -> Ajouter autre -> Sélectionnez Framework -> Copier les éléments si nécessaire -> Terminé.

Accès à Framework sur ViewController: -

import UIKit
import sampleCocoaFramework


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let frameworkObject =  openCocoaClass.init()
        frameworkObject.samplePublicFunction()
        print(frameworkObject.samplePublicVariable)


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
16
A.G

Selon le documentation Swift

Pour importer du code Objective-C dans Swift à partir de la même cible

  1. Dans votre fichier d'en-tête de pontage Objective-C, importez chaque en-tête Objective-C que vous souhaitez exposer à Swift. Par exemple:

    #import "XYZCustomCell.h"

    #import "XYZCustomView.h"

    #import "XYZCustomViewController.h"

  2. Sous Paramètres de construction, assurez-vous que le paramètre de construction Objective-C Bridging Header sous Swift Compiler - Génération de code a un chemin vers l'en-tête. Ce chemin doit être directement au fichier lui-même, pas au répertoire Le chemin doit être relatif à votre projet, de la même manière que votre chemin Info.plist est spécifié dans les paramètres de construction, ce qui vous évite généralement de devoir modifier ce paramètre.

Tous les en-têtes publics Objective-C répertoriés dans ce fichier d'en-tête de pontage seront visibles pour Swift. La fonctionnalité Objective-C sera disponible automatiquement dans tout fichier Swift= de cette cible, sans instruction d'importation. Utilisez votre code personnalisé Objective-C avec le même Swift = syntaxe que vous utilisez avec les classes système.

let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"

Assurez-vous également que le paramètre de génération "Defines Module" sous "Packaging" est défini sur "Yes".

12
Tomer Even

vous avez besoin dans votre projet Objective C d'un en-tête public portant le même nom que votre application, dans le cas où vous avez FrameworkName.h et ajoutez toutes les classes que vous souhaitez exposer (ces classes doivent être ajoutées en tant qu'en-tête public dans les propriétés du projet). Pour ce faire, vous ajoutez la structure et la référence à votre en-tête public import FrameworkName.

2
gustavo.a.hansen

Le dernier XCode offre la possibilité d’intégrer la structure à d’autres projets. Ce lien ( https://stackoverflow.com/a/37328591/1084174 ) a bien fonctionné pour moi.

0

Vous pouvez importer un cadre objC externe dans le projet Swift en utilisant la syntaxe ci-dessous:

#import "objCExternalFramework-name/headerfilename.h"

0
V V

Ok, c'est Xcode 7.2 maintenant. Et ce que j’ai observé est, Swift) l’importation est sensible à la casse. Exemple - import uikit ne fonctionnera pas. Vous devrez le taper comme import UIKit.

juste mes deux cents.

0
Sukhi