2015-04-14 8 views
31

Ich habe gerade ein Upgrade auf Xcode 6.3 durchgeführt und sie haben den Playgrounds etwas Neues an die Hand gegeben. Wenn Sie neue Spielplätze erstellen und den Projektnavigator öffnen, sehen Sie einen Sources-Ordner und darin befindet sich eine "SupportCode.swift" -Datei. An der Spitze dieser Datei liest esXcode-Spielplätze können nicht auf Swift-Dateien im Sources-Ordner zugreifen

This file (and all other Swift source files in the Sources directory 
of this playground) will be precompiled into a framework which is 
automatically made available to <PLAYGROUND_NAME>.playground. 

ich um eine Funktion versucht setzen und es ist mein Spielplatz nicht zur Verfügung. Was mache ich falsch? Muss ich die Datei SupportCode.swift manuell manuell kompilieren? Wie?

Antwort

99

Sie haben öffentliches Zugriffsattribut zu Ihren Klassen, Methoden und Eigenschaften in Quellordnern hinzufügen zugänglich von Haupt Spielplatz-Datei zu machen, wie sie als separates Modul vom Compiler behandelt

+12

Ich finde es wirklich seltsam, dass ich eine Klasse öffentlich machen und seine Funktion init öffentlich machen. – DerrickHo328

+6

wäre toll, wenn wir etwas wie den '@testable Import' für Spielplätze bekommen würden – dreamlab

+1

@ Calimari328 Wenn Sie class als public deklarieren, wird es außerhalb sichtbar, aber init() als public wird von außen erzeugt. Wenn Sie also einen Zugriff auf die Klasse geben und gleichzeitig die Instanziierung einschränken möchten, deklarieren Sie init() als weniger sichtbar. Ich habe ein Beispiel mit Singleton-Implementierung gegeben - um es klarer zu machen –

6

Wie bereits erwähnt, wenn Sie .swift erstellen Dateien im Quellordner sind automatisch für Ihren Spielplatzcode verfügbar. Um den Zugriff auf verschiedene Teile dieser Datei zu steuern, können Sie Access-Level-Modifikatoren verwenden: public, internal & private.

nach Swift programming language access control

Der Standardzugriffsebene in den meisten Fällen ist internal die im Inneren des Moduls zugänglich sind, aber nicht die Außenseite.

Mit anderen Worten, wenn Sie eine Klasse ohne Zugriffsmodifizierer deklarieren, können Sie aus einer anderen Datei im Quellordner, aber NICHT in der Hauptdatei Ihres Spielplatzes darauf zugreifen. Wenn Sie andererseits eine Klasse mit einem öffentlichen Modifikator deklarieren, können Sie in beiden Fällen darauf zugreifen.

für die praktische Nutzung: wir eine Singleton Implementierung Zuerst machen: Ich habe eine neue Datei im Quellordner namens ‚Singy.swift‘ mit folgenden Code erstellen:

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!; 
}} 

Zweitens: von meinem Spielplatz

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

beide s1 & s2 die gleiche Instanz verweisen, aber es erzeugt nur innerhalb der Klasse

12

Spielplätze sind gut für Lauftests. Geben Sie Ihren gesamten Code in das Verzeichnis Sources ein und haben Sie für jeden Test eine öffentlich zugängliche Testklasse. Dann führen Sie die öffentlich zugänglichen Tests vom Spielplatz aus.

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" 
    } 
} 
+0

Das ist wirklich von unschätzbarem Wert. Wie hast du das gelernt? – Confused