有什么方法可以让struct type array写入文件吗?

时间:2019-03-25 06:51:03

标签: struct swift4

我只想将一个结构类型数组写入文件,但是在我将其写入后,将不会在没有任何错误消息的情况下创建该文件!!!

代码:

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”,因为没有这样的文件。

2 个答案:

答案 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读取和写入属性列表。使用CodablePropertyListSerialization