【发布时间】:2020-09-16 10:10:52
【问题描述】:
我的 Swift 5 (Xcode 11.5) 应用程序将人员保存在文本文件(json 格式)中。
我用来解码json文本的structs:
struct People:Codable {
var groupName:String
var groupLocation:String
var members:[Person]
init(_ gn:String,_ gl:String,_ m:[Person] {
groupName = gn
groupLocation = gl
members = m
}
struct Person:Codable {
var name:String
var age:Int
var profession:String?
init(_ n:String,_ a:Int,_ p:String?) {
name = n
age = a
profession = (p==nil) ? "none" : p!
}
}
解码文本文件的内容:
let jsonData = Data(text.utf8)
let decoder = JSONDecoder()
let people = try decoder.decode(People.self, from: jsonData)
let members = people.members
for (i,member) in members.enumerated() {
//print(member.profession==nil)
//Do stuff
}
profession 是稍后添加的,将来可能还会添加更多值,但我希望我的应用程序能够向后兼容旧文件。如果profession 不存在,它应该使用"none" 代替(参见上面的代码)但是当我在解码后检查member.profession 时,它仍然是nil。 name, age,... 都包含正确的值,因此该部分有效。
如果 json 文件中不存在 profession 的值,我该如何在 struct 中赋值?什么是最简单/最干净的方法,所以我也可以稍后添加,如有必要(例如生日,性别,...)?
【问题讨论】:
-
覆盖
init(decoder:),并检查decodeifPresent() -
为什么要用字符串
"none"来表示不存在的职业?nil就是为此而生的! -
@Sweeper 这只是一个例子。我需要 String 有一个值 !=nil ,然后在我的应用程序中显示而无需进一步检查。
-
@Larme 我在发布这个问题之前看到了这个问题,但老实说,我不知道它是如何工作的,因为我不仅不使用枚举,而且我上面发布的两个代码段也在 2单独的 swift 文件。另外,我不只是想检查 json 文件中是否存在
profession,如果不存在,我还想给它一个自定义值。