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


73

我刚刚升级到Xcode 6.3,他们为Playgrounds提供了一些新功能。如果新建一个操场,然后打开项目导航器,则会看到Sources文件夹,并且在其中有一个“ SupportCode.swift”文件。在该文件的顶部读取

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

我尝试在其中放置一个函数,但我的游乐场无法使用它。我究竟做错了什么?我必须手动手动编译SupportCode.swift文件吗?怎么样?

Answers:


196

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


22
我感到很奇怪,我必须公开一个类并将其初始化函数公开。
DerrickHo328

12
如果我们在@testable import操场上
买到

3
@ Calimari328将您的类声明为公共类会使它在外部可见,但是将init()公开设置是要从外部实例化(创建实例)。因此,当您想授予对该类的访问权限,但同时又限制了其实例化时,您可以将init()声明为不可见。我给了与辛格尔顿上实施的实例-这样可以很清楚
尼基塔Kurtin

19

操场非常适合进行测试。将所有代码放在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"
  }
}

为什么需要Test1类和静态“运行”方法?为什么不创建一个公共的全局test1()函数呢?实现与类不添加任何东西相同的功能。
马克·A·多诺霍

9

如前所述,在Source文件夹中创建.swift文件时,它们会自动提供给您的Playground代码。要控制此文件不同部分的访问,可以使用访问级别修饰符,它们是:publicinternalprivate

根据Swift编程语言进行访问控制

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

换句话说,如果您声明一个没有访问修饰符的类,则可以从Source文件夹中的另一个文件访问它,但是不能从您的游乐场主文件中访问它。另一方面,如果用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!
    }
}

第二:从我的操场

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

双方s1s2引用相同的实例,但它的类中唯一的创建

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.