91

我刚刚升级到 Xcode 6.3,他们为 Playgrounds 提供了一些新的东西。如果你创建一个新的 Playgrounds 并打开项目导航器,你会看到一个 Sources 文件夹,里面有一个“SupportCode.swift”文件。在该文件的顶部,它读取

这个文件(以及这个 Playground 的 Sources 目录中的所有其他 Swift 源文件)将被预编译成一个框架,该框架会自动提供给 .playground。

我尝试在其中放置一个功能,但我的游乐场无法使用它。我究竟做错了什么?我是否必须手动编译 SupportCode.swift 文件?如何?

4

3 回答 3

221

您必须在源文件夹中的类、方法和属性中添加公共访问属性,以使它们可以从主操场文件访问,因为它们被编译器视为单独的模块

于 2015-04-18T00:10:29.687 回答
20

Playgrounds 非常适合运行测试。将所有代码放在Sources目录中,并为每个测试提供一个可公开访问的“测试”类。然后从操场上运行可公开访问的测试。

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"
  }
}
于 2016-10-24T02:57:52.077 回答
12

正如您在 Source 文件夹中创建 .swift 文件时所提到的,它们会自动可用于您的 Playground 代码。要控制对该文件不同部分的访问,您可以使用访问级别修饰符,它们是:publicinternal& private

根据Swift编程语言访问控制

在大多数情况下,默认访问级别是internal在模块内部可访问,而不是在外部。

换句话说,如果您声明一个没有访问修饰符的类,您可以从 Source 文件夹中的另一个文件访问它,但不能在 Playground 的主文件中访问它。另一方面,如果你声明一个带有 public 修饰符的类,你可以在这两种情况下访问它。

实际使用:让我们做一个单例实现首先:我在 Source 文件夹中创建一个名为“Singy.swift”的新文件,代码如下:

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

第二:从我的操场上

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

两者都s1引用s2同一个实例,但它只在类中创建

于 2015-06-03T07:19:59.937 回答