我只想将一个结构类型数组写入文件,但是在我将其写入后,将不会在没有任何错误消息的情况下创建该文件!!!
代码:
struct temp {
var a : String = ""
var b : Date = Date()
init(
a : String = "",
b : Date = Date(),
) {
self.a = ""
self.b = Date()
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var b = [temp]()
var c = temp()
c.a = "John"
c.b = Date()
b.append(c)
c.a = "Sally"
b.append(c)
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileURL = dir.appendingPathComponent("testFile")
do{
(b as NSArray).write(to: fileURL, atomically: true)
}catch{
print(error)
}
}
getTheFile()
}
func getTheFile() {
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileURL = dir.appendingPathComponent("testFile")
do {
print(try String(contentsOf: fileURL))
}catch{
print("read error:")
print(error)
}
}
}
getTheFile()中有错误消息
读取错误: Error Domain = NSCocoaErrorDomain代码= 260“无法打开文件“ testFile”,因为没有这样的文件。
答案 0 :(得分:0)
如果数组的内容都是所有属性列表对象(例如:NSString,NSData,NSArray,NSDictionary),则只有您可以使用writeToFile方法将数组写入文件中。 在您的实现中,数组包含的结构是值类型,而不是对象。这就是为什么您会遇到错误。
答案 1 :(得分:0)
您无法将自定义结构写入磁盘。您必须序列化它们。
简便的方法是Codable
协议和PropertyListEncoder/Decoder
struct Temp : Codable { // the init method is redundant
var a = ""
var b = Date()
}
var documentsDirectory : URL {
return try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var b = [Temp]()
var c = Temp()
c.a = "John"
c.b = Date()
b.append(c)
c.a = "Sally"
b.append(c)
let fileURL = documentsDirectory.appendingPathComponent("testFile.plist")
do {
let data = try PropertyListEncoder().encode(b)
try data.write(to: fileURL)
getTheFile()
} catch {
print(error)
}
}
func getTheFile() {
let fileURL = documentsDirectory.appendingPathComponent("testFile.plist")
do {
let data = try Data(contentsOf: fileURL)
let temp = try PropertyListDecoder().decode([Temp].self, from: data)
print(temp)
} catch {
print("read error:", error)
}
}
注意:
在Swift 从不中,使用NSArray/NSDictionary
API读取和写入属性列表。使用Codable
或PropertyListSerialization
。