gpt4 book ai didi

json - 在 iOS 中存储一个复杂的对象?

转载 作者:行者123 更新时间:2023-11-28 06:14:38 26 4
gpt4 key购买 nike

我有一个复杂的类对象如下:

class Ride {
var distance:String?
var price:Double?
var Legs:[Leg]?
var Routes:[Route]?
}

class Leg {
var id:int?
var value:string?
}

class Route {
var id:int?
var value:string?
}

我想要的是将它们存储为 JSON 或任何具有值的内容,并在需要时对其进行读写。我的方法是在创建 Ride 对象后将数据序列化为 JSON 并写入 ridesjson.json 文件,然后当我想从该 JSON 中读取时,我想序列化为 Ride 对象。我可以这样做还是有什么好的方法可以做到这一点?

最佳答案

在 Swift 3 中,将对象序列化为文件的标准方法是使其采用 NSCoding(它必须是 NSObject 才能工作)并实现 encode(with:)初始化(编码器:)。然后你可以归档到一个数据并保存它(并反向读取它的过程)。

class Person: NSObject, NSCoding {
var firstName : String
var lastName : String
override var description : String {
return self.firstName + " " + self.lastName
}
init(firstName:String, lastName:String) {
self.firstName = firstName
self.lastName = lastName
super.init()
}
func encode(with coder: NSCoder) {
coder.encode(self.lastName, forKey: "last")
coder.encode(self.firstName, forKey: "first")
}
required init(coder: NSCoder) {
self.lastName = coder.decodeObject(forKey:"last") as! String
self.firstName = coder.decodeObject(forKey:"first") as! String
super.init()
}

}

这是一个存档的例子:

let fm = FileManager.default
let docsurl = try fm.url(for:.documentDirectory,
in: .userDomainMask, appropriateFor: nil, create: false)
let moi = Person(firstName: "Matt", lastName: "Neuburg")
let moidata = NSKeyedArchiver.archivedData(withRootObject: moi)
let moifile = docsurl.appendingPathComponent("moi.txt")
try moidata.write(to: moifile, options: .atomic)

这里我们取消存档:

let fm = FileManager.default
let docsurl = try fm.url(for:.documentDirectory,
in: .userDomainMask, appropriateFor: nil, create: false)
let moifile = docsurl.appendingPathComponent("moi.txt")
let persondata = try Data(contentsOf: moifile)
let person = NSKeyedUnarchiver.unarchiveObject(with: persondata) as! Person
print(person) // "Matt Neuburg"

然而,在 Swift 4 中,使用 Codable 协议(protocol)可能更容易,从而使您的对象或多或少地自动序列化为属性列表或 JSON。 Codable 适用于任何类型,包括结构。这就是全部:

struct Person : Codable {
let firstName : String
let lastName : String
}

以下是存档人员的方法:

let p = Person(firstName: "Matt", lastName: "Neuburg")
let penc = PropertyListEncoder()
let d = try! penc.encode(p)

这是一个数据对象,您可以像前面的示例一样将它直接写入到磁盘。取消存档同样简单。假设 d 是您从磁盘读取的数据:

let p = try! PropertyListDecoder().decode(Person.self, from: d)

关于json - 在 iOS 中存储一个复杂的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45535558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com