Есть ли способ позволить массиву типа структуры писать в файл? - PullRequest
0 голосов
/ 25 марта 2019

Я просто хочу записать массив типа структуры в файл, но после его записи файл не создается без сообщения об ошибке !!! ???

код:

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 () * есть сообщение об ошибке

ошибка чтения: Ошибка домена = NSCocoaErrorDomain Code = 260 "Файл« testFile »не может быть открыт, поскольку такого файла нет.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Вы не можете записать пользовательские структуры на диск. Вы должны их сериализовать.

Самый простой способ - протокол 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 никогда используйте API NSArray/NSDictionary для чтения и записи списков свойств. Используйте либо Codable, либо PropertyListSerialization.

0 голосов
/ 25 марта 2019

Если содержимое массива - это все объекты списка свойств (например, NSString, NSData, NSArray, NSDictionary), то только метод writeToFile можно использовать для записи массива в файл.Здесь, в вашей реализации, массив содержит структуру, которая является типом значения, а не объектом.Вот почему вы получаете ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...