Question

Supposons une configuration comme celle-ci :

  • Vous avez un projet Xcode 6, dans lequel vous avez implémenté vos propres classes (par exemple MyView et MyViewController) avec Objective-C et Swift.
  • Vous avez ajouté un Playground dans votre projet

Dans le Playground, il est possible d'importer des modules (frameworks) comme UIKit avec le import mot-clé.Comment permettre l'accès aux autres classes du projet depuis le Playground ?

Le simple fait d'essayer d'accéder directement aux classes du projet entraîne un message d'erreur :Utilisation de l'identifiant non résolu 'MyView'

Était-ce utile?

La solution

Depuis Xcode 6.0 Beta 5, il est désormais possible d'importer vos propres frameworks dans un terrain de jeu.Cela fournit un moyen de partager du code entre vos applications et vos terrains de jeux, qui peuvent tous deux importer vos frameworks.Pour faire ça:

  1. Votre terrain de jeu doit être dans le même espace de travail que le projet qui produit votre framework.Votre espace de travail doit contenir une cible qui produit le framework, au lieu d'utiliser un framework prédéfini.

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

  3. Vous devez disposer d'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 framework pour le terrain de jeu).

  4. Votre préférence « Emplacement de construction » (dans les paramètres avancés « Emplacements » de Xcode) ne doit pas être définie sur « Héritage ».

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

  6. Vous devez ajouter une instruction d'importation à votre terrain de jeu pour le framework.

Une fois toutes ces conditions remplies, l’importation de votre framework fonctionnera dans un terrain de jeu.

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 un framework ;vous pouvez en savoir plus sur ce support "Sources auxiliaires" sur http://help.apple.com/xcode/mac/8.0/#/devfa5bea3af

Autres conseils

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

  • Créez un terrain de jeu vide et l'endroit se trouve quelque part sous 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 zéro, il devrait y avoir un exemple section-1.swift dans votre forfait)
  • Ajouter un lien physique (le lien symbolique ne semble pas fonctionner) nommé section-1.swift qui pointera en dehors du bundle 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, une avec le contenu de votre fichier de classe Swift et l'autre avec l'exemple de contenu que vous avez obtenu en créant le Playground à partir de zéro.

De cette façon, je peux réellement exécuter du code situé en dehors du Playground, mais Xcode semble planter plus souvent lorsque je le fais comme ça.

Modifier:

Depuis Xcode 6 bêta 5, vous pouvez désormais faire référence aux fichiers de projet, comme l'indique Rick Ballard dans son répondre.

Depuis la Beta 5 de Xcode 6 il est possible d'importer votre code s'il est dans un framework.Ce que vous devez faire est de créer une cible de framework, d'y ajouter les fichiers Swift et de le faire dans votre terrain de jeu.

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 souhaitez voir public.Vous devrez construire le projet avant que les modifications ne soient disponibles dans le terrain de jeu.(Vous devrez également modifier le terrain de jeu pour déclencher la réexécution.)

Important

Ne donnez pas au fichier du terrain 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 tentera de s'exécuter :

Échec de l'exécution du terrain de jeu :erreur:Impossible de rechercher les symboles :

J'ai perdu une heure à comprendre ça.:)

Je n'ai pas pu le faire fonctionner en utilisant aucune des réponses ici, alors j'ai commencé à jouer et j'ai trouvé un moyen simple qui m'a permis d'importer une classe rapide dans un terrain de jeu.

Créez simplement un terrain de jeu dans votre projet, il y a un répertoire à l'intérieur appelé « sources », faites simplement glisser une copie de la classe Swift dans ce dossier et le terrain de jeu y aura alors accès.

Par exemple:

enter image description here

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

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

De cette façon, les modifications apportées à votre fichier source prendront effet immédiatement dans votre terrain de jeu. A très bien fonctionné.

Xcode 8.2, Swift 3.0.1, macOS Sierra

Tout ce que vous avez à faire, c'est d'écrire au début :

import ModuleName

(en supposant que votre terrain de jeu soit placé dans le même espace de travail que le framework/projet)

Si ça ne marche pas :

  1. Reconstruisez votre projet

  2. Recréez un terrain de jeu et copiez-y tout l'ancien terrain de jeu

Cela résout beaucoup de problèmes étranges erreurs avec échecs d'initialisation et d'importation de n'importe quoi !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top