web-dev-qa-db-ja.com

Xcodeプレイグラウンドは、Swift Sourcesフォルダー内のファイルにアクセスできません

Xcode 6.3にアップグレードしたばかりで、Playgroundsに新しいものを提供してくれました。新しいプレイグラウンドを作成し、プロジェクトナビゲーターを開くと、Sourcesフォルダーが表示され、その中に "SupportCode.Swift"ファイルがあります。そのファイルの一番上で

このファイル(およびこのプレイグラウンドのSourcesディレクトリにある他のすべてのSwiftソースファイル)は、.playgroundで自動的に利用可能になるフレームワークにプリコンパイルされます。

私はそこに関数を入れてみましたが、私の遊び場では利用できません。何が間違っていますか? SupportCode.Swiftファイルを手動でコンパイルする必要がありますか?どうやって?

54
DerrickHo328

ソースフォルダー内のクラス、メソッド、およびプロパティにpublic access属性を追加して、コンパイラーによって個別のモジュールとして扱われるため、メインのプレイグラウンドファイルからアクセスできるようにする必要があります

162
Vitali

プレイグラウンドは、テストの実行に適しています。すべてのコードをSourcesディレクトリに配置し、テストごとに1つの公開アクセス可能な 'test'クラスを用意します。次に、プレイグラウンドからパブリックにアクセス可能なテストを実行します。

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

ソースフォルダーに.Swiftファイルを作成するときに述べたように、これらのファイルはプレイグラウンドコードで自動的に使用可能になります。このファイルの異なる部分のアクセスを制御するには、publicinternalprivateのアクセスレベル修飾子を使用できます。

Swiftプログラミング言語のアクセス制御

ほとんどの場合、デフォルトのアクセスレベルはinternalで、モジュール内ではアクセスできますが、外部からはアクセスできません。

つまり、アクセス修飾子なしでクラスを宣言すると、ソースフォルダーの別のファイルからアクセスできますが、プレイグラウンドのメインファイルからはアクセスできません。一方、パブリック修飾子を使用してクラスを宣言すると、両方の場合にアクセスできます。

実際に使用するには、まずシングルトン実装を作成しましょう。次のコードを使用して、「Singy.Swift」という名前のSourceフォルダーに新しいファイルを作成します。

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

2番目:私の遊び場から

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

両方 s1およびs2同じインスタンスを参照しますが、クラス内でのみ作成されます

6
Nikita Kurtin