如何将 NSData 写入 Swift 中的新文件?
How to write NSData to a new file in Swift?
我正在努力将 NSData 实例的内容写入文件。我目前正在使用 Xcode 游乐场。
这是我的代码:
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
}
}
我在资源中有一个名为 newdata.json 的文件,但当我检查它时,里面什么也没有。我也尝试删除并查看是否会创建该文件,但它仍然不起作用。
您的代码是正确的,但文件没有写在您期望的位置。 Swift Playgrounds 是沙盒的,文件位于系统的另一部分,而不是项目的资源文件夹中。
您可以通过立即尝试读取文件来检查文件是否确实被保存,如下所示:
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
}
}
来自 Tom 在下面的评论:具体来说,文件位于 /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.
之类的地方
如果您使用的是 Xcode 8,则有更好的方法。
首先,在您的 Documents
文件夹中创建一个名为 Shared Playground Data
的目录。
接下来,在您的 playground 中导入 playground 支持:
import PlaygroundSupport
最后,在您的文件 URL 中使用 playgroundSharedDataDirectory
。它将指向上面创建的文件夹:
let fileURL = playgroundSharedDataDirectory.appendingPathComponent("test.txt")
然后您可以 read/write 在您的 playground 中 URL,并(更容易地)检查您正在保存的文件。这些文件将位于您在上面创建的 Shared Playground Data
文件夹中。
使用以下扩展名:
extension Data {
func write(withName name: String) -> URL {
let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(name)
try! write(to: url, options: .atomicWrite)
return url
}
}
我正在努力将 NSData 实例的内容写入文件。我目前正在使用 Xcode 游乐场。
这是我的代码:
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
}
}
我在资源中有一个名为 newdata.json 的文件,但当我检查它时,里面什么也没有。我也尝试删除并查看是否会创建该文件,但它仍然不起作用。
您的代码是正确的,但文件没有写在您期望的位置。 Swift Playgrounds 是沙盒的,文件位于系统的另一部分,而不是项目的资源文件夹中。
您可以通过立即尝试读取文件来检查文件是否确实被保存,如下所示:
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
}
}
来自 Tom 在下面的评论:具体来说,文件位于 /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.
如果您使用的是 Xcode 8,则有更好的方法。
首先,在您的 Documents
文件夹中创建一个名为 Shared Playground Data
的目录。
接下来,在您的 playground 中导入 playground 支持:
import PlaygroundSupport
最后,在您的文件 URL 中使用 playgroundSharedDataDirectory
。它将指向上面创建的文件夹:
let fileURL = playgroundSharedDataDirectory.appendingPathComponent("test.txt")
然后您可以 read/write 在您的 playground 中 URL,并(更容易地)检查您正在保存的文件。这些文件将位于您在上面创建的 Shared Playground Data
文件夹中。
使用以下扩展名:
extension Data {
func write(withName name: String) -> URL {
let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(name)
try! write(to: url, options: .atomicWrite)
return url
}
}