web-dev-qa-db-fra.com

Comment importer des classes de votre propre projet dans un terrain de jeu

Supposons une configuration comme celle-ci:

  • Vous avez un projet Xcode 6, dans lequel vous avez implémenté vos propres classes (dites MyView et MyViewController) avec Objective-C et Swift.
  • Vous avez ajouté un terrain de jeu à votre projet.

Dans le Playground, il est possible d'importer des modules (frameworks) tels que UIKit avec le mot clé import. Comment autorisez-vous l'accès aux autres classes du projet à partir du Playground?

Le fait d’essayer d’accéder directement aux classes de projet entraîne un message d’erreur: tilisation de l’identificateur non résolu "MyView"

76
Markus Rautopuro

À partir de Xcode 6.0 Bêta 5, il est maintenant possible d'importer vos propres cadres dans un terrain de jeu. Cela permet de partager le code entre vos applications et vos terrains de jeu, ce qui permet d'importer vos frameworks. Pour faire ça:

  1. Votre terrain de jeu doit se trouver dans le même espace de travail que le projet qui produit votre cadre. Votre espace de travail doit contenir une cible qui produit le cadre, au lieu d'utiliser un cadre pré-construit.

  2. Vous devez avoir déjà construit votre framework. S'il s'agit d'un framework iOS, il doit être créé pour une destination d'exécution 64 bits (par exemple, l'iPhone 5) et pour le simulateur.

  3. Vous devez avoir un schéma actif qui construit au moins une cible (l'emplacement de construction de cette cible sera utilisé dans le chemin de recherche du cadre pour le terrain de jeu).

  4. Votre préférence "Construire l'emplacement" (dans les paramètres avancés "Emplacements" de Xcode) ne doit pas être définie sur "Héritage".

  5. Si votre structure n'est pas une structure Swift, le paramètre de construction "Defines Module" doit être défini sur "Oui".

  6. Vous devez ajouter une déclaration d'importation à votre terrain de jeu pour le cadre.

Une fois toutes ces conditions remplies, l’importation de votre cadre fonctionnera dans une cour de récréation.

Dans Xcode 7, nous avons introduit un autre mécanisme que vous pouvez utiliser pour importer vos propres classes en tant que source, au lieu d'importer une structure. Pour en savoir plus sur le support "Sources auxiliaires", consultez la page http://help.Apple.com/xcode/mac/8.0/#/devfa5bea3af

56
Rick Ballard

En fait, j'ai réussi à faire référence à d'autres fichiers Swift dans le projet actuel:

  • Créez un terrain de jeu vide et placez-le quelque part dans votre projet.
  • Ouvrez le YourPlayground.playground bundle (oui, c’est un bundle = répertoire) dans Terminal.
  • Modifier contents.xcplayground par exemple avec vi et ajoutez une autre section comme celle-ci:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='3.0' sdk='iphonesimulator'> 
   <sections>
       <code source-file-name='section-1.Swift'/>
       <code source-file-name='section-2.Swift'/>
   </sections>
   <timeline fileName='timeline.xctimeline'/>
</playground>
  • Renommer section-1.Swift à section-2.Swift _ (si vous avez créé le Playground à partir de rien, il devrait y avoir un exemple section-1.Swift dans votre paquet)
  • Ajoutez un lien dur (le lien symbolique semble ne pas fonctionner) nommé section-1.Swift qui pointe vers l’extérieur du paquet vers votre fichier de classe Swift) comme:
ln ../../Classes/MyView.Swift section-1.Swift
  • Fermez Xcode et ouvrez à nouveau le Playground.
  • Il devrait maintenant y avoir deux sections, l’une avec le contenu de votre fichier de classe Swift) et l’autre avec l’exemple de contenu obtenu en créant le Playground à partir de rien.

De cette façon, je peux exécuter du code hors du Playground, mais Xcode semble planter plus souvent en procédant ainsi.

Modifier:

Depuis Xcode 6 beta 5, vous pouvez maintenant faire référence à des fichiers de projet, comme l’indique Rick Ballard dans son réponse .

17
Markus Rautopuro

Depuis la version bêta 5 de Xcode 6, il est possible d'importer votre code s'il se trouve dans un cadre. Ce que vous devez faire est de créer une cible pour le framework, ajoutez les fichiers Swift présents sur votre

import ModuleName

Vous pouvez rechercher le nom du module dans les paramètres de construction. C'est généralement le même que le nom de la cible.

N'oubliez pas de créer le code que vous voulez voir public. Vous devrez créer le projet avant que des modifications ne soient disponibles dans la cour de récréation. (Vous devrez également modifier le terrain de jeu pour déclencher une nouvelle exécution.)

Important

Ne donnez pas au même fichier de jeu le même nom que la cible! Si vous le faites, l'importation semble fonctionner, mais vous obtiendrez l'erreur suivante lorsque le terrain de jeu tente de s'exécuter:

L'exécution du terrain de jeu a échoué: erreur: impossible de rechercher les symboles:

J'ai perdu une heure à comprendre cela. :)

12
nschum

Je ne pouvais pas le faire fonctionner en utilisant l'une des réponses ici, alors j'ai commencé à jouer et trouvé un moyen simple qui a fonctionné pour moi d'importer une classe Swift dans un terrain de jeu.

Créez simplement un terrain de jeu dans votre projet. Un répertoire à l'intérieur du projet appelé "sources" suffit de faire glisser une copie de la classe Swift) dans ce dossier. Le terrain de jeu y aura alors accès.

Par exemple:

enter image description here

10
de Raad

Je viens de mettre des liens vers tous mes Swift fichiers dans le dossier Sources:

cd /path/to/project/MyPlayground.playground/Sources
ln -s ../../*.Swift .

De cette façon, les changements dans votre fichier source prendront effet immédiatement dans votre terrain de jeu. Très bien travaillé.

Xcode 8.2, Swift 3.0.1, macOS Sierra

3
qed