web-dev-qa-db-fra.com

Créer et importer un cadre Swift

Je suis nouveau dans la programmation Swift. Je dois créer un cadre Swift pur et l'importer dans mon projet Swift pur existant. Lorsque j'essaie d'importer un cadre Swift, le message d'erreur suivant s'affiche: message:

"Could not build Objective-C module '<myModule>'"

Framework File Structure

Test.h

 import Foundation

public class Test {
    class func printTest() {
        println("111");
    }
}

Asdf.h

import UIKit
public class Asdf: Test {
    class func echo() {
        println(888);
    }
}

myModule-Swift.h

#ifndef <myModule>_<myModule>_Swift_h
#define <myModule>_<myModule>_Swift_h

#endif

Après la construction du framework, j’ai ajouté le framework à mon projet existant et récupère ce Project Structure and import problem screen

Qu'est-ce que je fais mal? Merci pour l'aide!

@findall comment answer - J'ai essayé d'ajouter tous les fichiers de structure au dossier racine de mon projet et à l'intérieur du dossier du projet, mais j'ai à nouveau eu la même erreur Add Framework files to project root

Add Framework files inside project folder

16
styopdev

Je l'ai fait avec les étapes suivantes.

  1. Créez un projet-cadre, nommé par exemple "FooKit". (Cocoa Touch Framework à sélectionner)
  2. Créez un fichier ".Swift" et ajoutez-y un symbole public, par exemple public func foo().
  3. Créez un projet (application) utilisateur. (J'ai choisi Single View Application)
  4. Ouvrez le répertoire racine de "FooKit" dans le Finder, faites-y glisser "FooKit.xcodeproj" et déposez-le dans le projet d'application via Project Navigator.
  5. Ajoutez "FooKit" à Target Dependencies dans le paramètre Build Phases de l'application.
  6. Ajoutez "FooKit.framework" à Embedded Binaries dans les paramètres General de l'application.

Maintenant, vous pouvez construire comme ce code dans l'application utilisateur.

import FooKit

func bar() {
    foo()
}
19
findall

Dans Xcode 7.2 avec Swift 2.1, j’ai réussi à dépasser l’erreur mentionnée en veillant à ce que les paramètres de construction de votre infrastructure Swift pure, appelée Foo, soient les suivants:

1) Paramètres de construction-> Conditionnement-> Module défini = Oui

2) Paramètres de construction-> Compilateur Swift - Génération de code-> Installer l'en-tête de compatibilité Objective-C = Oui (si vous n'avez pas besoin d'importer votre infrastructure Swift dans Objective C, définissez ce paramètre sur Non )

3) Effacez la valeur de chaîne de Build Settings-> Swift Compiler - Génération de code-> Objective-C Bridging Header

4) Build Settings-> Swift Compiler - Génération du code-> Nom d'en-tête d'interface généré par Objective-C = Foo-Swift.h (si vous n'avez pas besoin d'importer votre infrastructure Swift dans Objective C, effacez ce paramètre comme vous l'avez fait auparavant. à l'étape 3))

5) Assurez-vous que Build Settings-> Packaging-> Product Name = Foo

6) Ajoutez à l'en-tête public umbrella de votre framework (Foo.h), que vous pouvez utiliser pour importer votre code Swift dans Objective C, la ligne suivante:

#import "Foo-Swift.h"

(mais si vous n'avez pas besoin d'importer votre code Swift dans Objective C, ignorez cette étape)

6) Ajoutez la ligne suivante au fichier Swift où vous souhaitez utiliser le module Foo:

import Foo

Notes IMPORTANTES:

1) Assurez-vous que votre en-tête parapluie Foo.h est défini sur public dans l'inspecteur de fichier, sinon cela ne fonctionnera pas.

2) Si vous utilisez votre infrastructure Swift pure dans des fichiers Objective C, assurez-vous que:

  • l'en-tête Foo-Swift.h a généré l'interface correcte en accédant à Foo.h, en cliquant sur le menu en haut à gauche de l'éditeur de code Xcode, puis en choisissant Includes-> Foo-Swift.h (j'ai dû reconstruire le Foo plusieurs fois jusqu'à ce que Xcode prenne en compte le changement, puis génère l'interface correcte dans Objective C, vous devrez peut-être le faire également)

  • vos classes Swift héritent de NSObject ou ne seront pas disponibles pour le code Objective C

3
jvarela

De plus, pour la réponse de @ jvarela, dans Xcode 9 et Swift 4,

Pour importer la structure Swift dans un projet Objective C, vous devez ajouter 

@objc

marquez toutes vos classes, méthodes et variables que vous souhaitez exporter dans un projet Objective C.

Par exemple,

@objc public class Foo: NSObject {

    @objc public var fooDescription: String

    @objc public func foo(){

    }

}
2
yvzzztrk

Sur Swift:

Créer un cadre: -

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

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

  3. Ajoutez une classe publique: Fichier -> Nouveau fichier -> iOS -> Fichier Swift -> Nommez-le (ex. 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 -> Modifier 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 un cadre -> 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()
    }
}
1
A.G