I am working to get the contents of an NSData instance written to a file. I am currently using an Xcode playground.
This is my code:
let validDictionary = [
"numericalValue": 1,
"stringValue": "JSON",
"arrayValue": [0, 1, 2, 3, 4, 5]
]
let rawData: NSData!
if NSJSONSerialization.isValidJSONObject(validDictionary) {
do {
rawData = try NSJSONSerialization.dataWithJSONObject(validDictionary, options: .PrettyPrinted)
try rawData.writeToFile("newdata.json", options: .DataWritingAtomic)
} catch {
// Handle Error
}
}
I have a file named newdata.json located in resources but when I check it there is nothing inside. I also tried deleting and seeing if the file will be created but it still doesn't work.
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
}
}
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/folders/bc/lgy7c6tj6pjb6cx0p108v7cc0000gp/T/com.apple.dt.Xcode.pg/containers/com.apple.dt.playground.stub.iOS_Simulator.MyPlayground-105DE0AC-D5EF-46C7-B4F7-B33D8648FD50/newdata.json.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With