Swift 2.0 代码在 Xcode 中有效,但在 Playground 中无效

Swift 2.0 code works in Xcode but not in Playground

我正在学习 Swift 并且在尝试弄清楚我无法加载文件的原因时感到很沮丧。事实证明,该代码在 Xcode 中有效,但在操场上无效。这是什么原因?

代码如下:

func testFileLoad(){
    let myFilePath: String = "/Users/clay/Desktop/test.txt"
    let t: Bool = NSFileManager.defaultManager().fileExistsAtPath(myFilePath)
    print(t)

    let s: String = try! String(contentsOfFile: myFilePath, encoding: NSUTF8StringEncoding)
    print(s)

    do {
        let p: String = try String(contentsOfFile: myFilePath, encoding: NSUTF8StringEncoding)
        print(p)
    } catch {
        print("nope")
    }
}

运行 在 Xcode 的一个测试模块中,它工作正常并在控制台打印我希望的内容。

Test Suite 'Selected tests' started at 2015-08-05 14:24:15.977 
Test Suite 'swiftgraphTests' started at 2015-08-05 14:24:15.978 
Test Case '-[swiftgraphTests.swiftgraphTests testFileLoad]' started. 
true 
this is a test 
this is a test 
Test Case '-[swiftgraphTests.swiftgraphTests testFileLoad]' passed (0.001 seconds). 
Test Suite 'swiftgraphTests' passed at 2015-08-05 14:24:15.979.      
    Executed 1 test, with 0 failures (0 unexpected) in 0.001 (0.001) seconds 
Test Suite 'Selected tests' passed at 2015-08-05 14:24:15.979.   
    Executed 1 test, with 0 failures (0 unexpected) in 0.001 (0.002) seconds

在操场上,我得到了这个:

我在这里做错了什么?我是不是使用游乐场不当?

可能是权限问题。可能在您的 XCode 项目中,您拥有一组在 playground 中不可用的权限。

如果您转到菜单

"View" -> "Debug Area" -> "Show Debug Area"

您将看到完整的错误:"you don't have permissions to access the filesystem from the Playground*."

解决方法是使用项目导航器包含 Playground 中的文件。

转到菜单

"View" -> "Navigators" -> "Show Project Navigator"

然后将文件拖放到 "Resources" 文件夹中。

然后使用NSBundle获取路径。

func testFileLoad() {

    // get the file path for the file from the Playground's Resources folder
    guard let path = NSBundle.mainBundle().pathForResource("test", ofType: "txt") else {
            print("Oops, the file is not in the Playground")
            return
    }

    // keeping the examples from your question
    let s: String = try! String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
    print(s)

    do {
        let p: String = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
        print(p)
    } catch {
        print("nope")
    }

}

testFileLoad()

*实际上您只能访问包含您的 Playground 共享数据的 /var/ 文件夹,而 Playground 只是提供了一个快捷方式。 Playground 导航器中的这个文件夹实际上代表 /var/ 文件夹,并且对于每个 Playground 都是唯一的。你可以用NSBundle看到它的地址:

NSBundle.mainBundle().resourcePath