How to write NSData to a new file in Swift?

亡梦爱人 提交于 2019-12-04 14:43:12
Carter

Your code is correct, but the file is not being written where you expect. Swift Playgrounds are sandboxed and the files are in another part of the system, not in your project's resources folder.

You can check that the file is actually being saved by immediately trying to read from it, like so:

let validDictionary = [
    "numericalValue": 1,
    "stringValue": "JSON",
    "arrayValue": [0, 1, 2, 3, 4, 5]
]

let rawData: NSData!


if NSJSONSerialization.isValidJSONObject(validDictionary) { // True
    do {
        rawData = try NSJSONSerialization.dataWithJSONObject(validDictionary, options: .PrettyPrinted)
        try rawData.writeToFile("newdata.json", options: .DataWritingAtomic)

        var jsonData = NSData(contentsOfFile: "newdata.json")
        var jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: .MutableContainers)
        // -> ["stringValue": "JSON", "arrayValue": [0, 1, 2, 3, 4, 5], "numericalValue": 1]

    } catch {
        // Handle Error
    }
}

From Tom's comment below: Specifically, the file is in some place like /private/var/folder‌​s/bc/lgy7c6tj6pjb6cx0‌​p108v7cc0000gp/T/com.‌​apple.dt.Xcode.pg/con‌​tainers/com.apple.dt.‌​playground.stub.iOS_S‌​imulator.MyPlayground‌​-105DE0AC-D5EF-46C7-B‌​4F7-B33D8648FD50/newd‌​ata.json.

Use following extension:

extension Data {

    func write(withName name: String) -> URL {

        let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(name)

        try! write(to: url, options: .atomicWrite)

        return url
    }
}

If you are using Xcode 8, there's a better approach.

First, create a directory in your Documents folder called Shared Playground Data.

Next, import playground support in your playground:

import PlaygroundSupport

Finally, use playgroundSharedDataDirectory in your file URLs. It will point to the folder created above:

let fileURL = playgroundSharedDataDirectory.appendingPathComponent("test.txt")

You can then read/write that URL in your playground, and (more easily) inspect the files that you're saving. The files will be located in the Shared Playground Data folder you created above.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!