web-dev-qa-db-fra.com

Les aires de jeux Xcode ne peuvent pas accéder aux fichiers Swift dans le dossier Sources

Je viens de passer à Xcode 6.3 et ils ont offert quelque chose de nouveau aux Playgrounds. Si vous créez une nouvelle aire de jeux et que vous ouvrez le navigateur de projet, vous verrez un dossier Sources et à l'intérieur de celui-ci se trouve un fichier "SupportCode.Swift". En haut de ce fichier, il lit

Ce fichier (et tous les autres Swift dans le répertoire Sources de ce terrain de jeu) seront précompilés dans un framework qui est automatiquement mis à la disposition de .playground.

J'ai essayé d'y mettre une fonction et elle n'est pas disponible sur mon terrain de jeu. Qu'est-ce que je fais mal? Dois-je compiler manuellement le fichier SupportCode.Swift manuellement? Comment?

54
DerrickHo328

Vous devez ajouter public attribut d'accès à vos classes, méthodes et propriétés dans le dossier source pour les rendre accessibles à partir du fichier principal de la cour de récréation car ils sont traités comme un module séparé par le compilateur

162
Vitali

Les terrains de jeux sont bons pour exécuter des tests. Placez tout votre code dans le répertoire Sources et disposez d'une classe "test" accessible au public, pour chaque test. Exécutez ensuite les tests accessibles au public depuis la cour de récréation.

playground

Test1.run()
Testx.run()
...

Sources/Test1.Swift

public class Test1 {      
  public static func run() {
    let my_class = MyClass()
    let result = my_class.do_something()
    print(result)
  }
}

Sources/MyClass.Swift

class MyClass {
  func do_something() -> String {
    return "lol"
  }
}
16
nich

Comme mentionné lorsque vous créez des fichiers .Swift dans le dossier Source, ils sont automatiquement disponibles pour votre code de terrain de jeu. Pour contrôler l'accès à différentes parties de ce fichier, vous pouvez utiliser des modificateurs de niveau d'accès qui sont: public, internal & private.

Selon contrôle d'accès au langage de programmation Swift

Le niveau d'accès par défaut dans la plupart des cas est internal qui est accessible à l'intérieur du module, mais pas à l'extérieur.

En d'autres termes, si vous déclarez une classe sans modificateur d'accès, vous pouvez y accéder à partir d'un autre fichier dans le dossier Source mais PAS dans le fichier principal de votre aire de jeux. d'autre part, si vous déclarez une classe avec un modificateur public, vous pouvez y accéder dans les deux cas.

pour une utilisation pratique: faisons une implémentation Singleton Premièrement: je crée un nouveau fichier dans le dossier Source nommé 'Singy.Swift' avec le code suivant:

public class Singy {
    public var name = ""
    private static var instance: Singy?
    private init() {}

    public static func getSingy() -> Singy {
        if Singy.instance == nil {
            Singy.instance = Singy()
        }
        return Singy.instance!
    }
}

Deuxièmement: depuis mon terrain de jeu

var s1 = Singy.getSingy()
var s2 = Singy.getSingy()
s1.name = "One"
print(s2.name)

Tous les deux s1 et s2 référence la même instance, mais elle n'a été créée que dans la classe

6
Nikita Kurtin