Xcode playgrounds无法访问Sources文件夹中的swift文件

Der*_*328 56 swift swift-playground xcode6.3

我刚刚升级到Xcode 6.3,他们为Playgrounds提供了一些新功能.如果您创建一个新的游乐场并打开项目导航器,您将看到一个Sources文件夹,里面有一个"SupportCode.swift"文件.它在该文件的顶部读取

此文件(以及此操场的Sources目录中的所有其他Swift源文件)将预编译到一个框架中,该框架可自动提供给.playground.

我尝试将功能放到那里,我的操场无法使用.我究竟做错了什么?我是否必须手动手动编译SupportCode.swift文件?怎么样?

小智 167

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

  • 我发现我必须公开一个类并将其init函数设为public是非常奇怪的. (21认同)
  • 如果我们得到像游乐场的`@testable import`这样的话会很棒 (8认同)
  • @ Calimari328将您的类声明为公共类会使它在外部可见,但是将init()公开设置是要从外部实例化(创建实例)。因此,当您想授予对类的访问权限但同时又限制了其实例化时,您可以将init()声明为不那么可见。我以Singleton实现为例-使其更加清晰 (2认同)

小智 16

游乐场适合跑步测试.将所有代码放在Sources目录中,并为每个测试提供一个可公开访问的"测试"类.然后从操场上运行可公开访问的测试.

playground

Test1.run()
Testx.run()
...
Run Code Online (Sandbox Code Playgroud)

Sources/Test1.swift

public class Test1 {      
  public static func run() {
    let my_class = MyClass()
    let result = my_class.do_something()
    print(result)
  }
}
Run Code Online (Sandbox Code Playgroud)

Sources/MyClass.swift

class MyClass {
  func do_something() -> String {
    return "lol"
  }
}
Run Code Online (Sandbox Code Playgroud)


Nik*_*tin 6

如上所述,当您在Source文件夹中创建.swift文件时,它们将自动可用于您的游乐场代码.要控制对此文件的不同部分的访问,可以使用以下访问级别修饰符:public,internal&private.

根据Swift编程语言访问控制

大多数情况下,默认访问级别internal可在模块内部访问,但不能在外部访问.

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

实际用法:让我们做一个Singleton实现首先:我在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!
    }
}
Run Code Online (Sandbox Code Playgroud)

第二:从我的操场上

var s1 = Singy.getSingy()
var s2 = Singy.getSingy()
s1.name = "One"
print(s2.name)
Run Code Online (Sandbox Code Playgroud)

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