Comment importer ses propres classes à partir de son propre projet dans un terrain de jeu
supposons une configuration comme celle-ci:
- vous avez un projet Xcode 6, où vous avez implémenté vos propres classes (par exemple MyView et MyViewController) avec à la fois Objectif-C et Swift
- vous avez ajouté un terrain de jeu dans votre projet
dans le terrain de jeu, il est possible d'importer des modules (cadres) comme UIKit
avec le mot-clé import
. Comment activer l'accès aux autres les classes à partir de l'aire de Jeux?
juste essayer d'accéder à des classes de projet donne directement un résultat avec un message d'erreur: utilisation de l'identificateur non résolu 'MyView'
6 réponses
à partir de Xcode 6.0 Beta 5, il est maintenant possible d'importer vos propres cadres dans un terrain de jeu. Cela fournit une façon de partager le code entre vos applications et les terrains de jeu, qui peuvent tous les deux importer vos cadres. Pour ce faire:
-
votre terrain de jeu doit être 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 pré-cadre bâti.
-
vous devez avoir déjà construit votre charpente. Si c'est un framework iOS, il doit être construit pour une destination 64 bits (par exemple iPhone 5s), et doit être construit pour le simulateur.
-
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 framework pour le terrain de jeu).
-
Votre "Emplacement De Build" la préférence (dans les paramètres "localisations" avancés de Xcode) ne doit pas être définie à "Legacy".
-
si votre framework N'est pas un framework Swift, le paramètre de construction" Defines Module "doit être défini à"Oui".
-
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 un récréation.
dans Xcode 7 Nous avons introduit un autre mécanisme que vous pouvez utiliser pour importer vos propres classes comme source, au lieu d'importer un framework; vous pouvez lire à propos de ce support "sources auxiliaires" à http://help.apple.com/xcode/mac/8.0/#/devfa5bea3af
j'ai en fait réussi à me référer à d'autres fichiers Swift dans le projet actuel en faisant ceci:
- créer un terrain de jeu vide et place est quelque part dans votre projet.
- ouvrez le paquet
YourPlayground.playground
(Oui, c'est un paquet = répertoire) dans le Terminal. - modifier
contents.xcplayground
par exemple avecvi
et ajouter une autre section comme ceci:
<?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
ensection-2.swift
(si vous avez créé le terrain de jeu à partir de zéro, il devrait y avoir un exemplesection-1.swift
dans votre paquet) - Ajouter un lien dur (le lien symbolique ne semble pas fonctionner) nommé
section-1.swift
qui pointera à l'extérieur du paquet vers votre fichier de classe Swift comme:
ln ../../Classes/MyView.swift section-1.swift
- Fermer Xcode et ouvrez le terrain de jeu de nouveau.
- maintenant, il devrait y avoir deux sections, une avec le contenu de votre fichier de classe Swift et l'autre avec le contenu d'exemple que vous avez obtenu en créant le terrain de jeu à partir de zéro.
de cette façon, je peux réellement exécuter du code gisant à l'extérieur du terrain de jeu, mais Xcode semble se planter plus souvent en le faisant comme ça.
Edit:
selon le Xcode 6 beta 5 vous pouvez maintenant vous référer aux fichiers du projet, comme Rick Ballard l'indique dans sa réponse .
depuis 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 framework, ajouter les fichiers Swift là et dans votre terrain de jeu faire
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 faire le code que vous voulez voir public
. Vous aurez besoin de construire le projet avant que les changements sont disponibles dans le récréation. (Vous aurez également besoin d'éditer le terrain de jeu pour déclencher la ré-exécution.)
Important
Ne pas donner de l'aire de jeux fichier le même nom que la cible! Si vous le faites, importer semble fonctionner mais vous obtiendrez l'erreur suivante lorsque le terrain de jeu essaie d'exécuter:
L'exécution de terrain de jeu a échoué: erreur: ne pouvait pas rechercher les symboles:
j'ai perdu une heure à le comprendre. :)
Je n'ai pas pu le faire fonctionner en utilisant l'une des réponses ici, donc j'ai commencé à Jouer et j'ai trouvé un moyen simple qui a fonctionné pour moi d'importer une classe swift dans un terrain de jeu.
il suffit de créer un terrain de jeu dans votre projet, il y a un répertoire appelé 'sources' à l'intérieur, il suffit de glisser une copie de la classe swift dans ce dossier et le terrain de jeu y aura alors accès.
par exemple:
je viens de mettre des liens vers tous mes fichiers swift 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. a très bien fonctionné .
Xcode 8.2, Swift 3.0.1, macOS Sierra
Tout ce que vous avez à faire - est d'écrire au début:
import ModuleName
(en supposant que votre terrain de jeu est placé dans le même espace de travail que le cadre/projet)
si ça ne marche pas:
-
Reconstruire votre projet
-
Recréer une aire de jeux et de copier tous de l'ancienne aire de jeux là
Il résout beaucoup d'étranges erreurs avec init's et importations de n'importe quoi!