Swift中如何正确定义含数组的不可变值?NSNull是否适用于空值?
解决你的Swift不可变值定义问题
嗨,我来帮你搞定这两个问题~
一、正确定义members数组
你的JSON里members是一个包含用户对象的数组,在Swift里有两种常见的定义方式,看你需求选择:
方式1:使用类型安全的结构体(推荐)
先给数组里的成员定义一个结构体,这样后续使用的时候类型更明确,不容易出错:
// 先定义Member结构体,对应数组里的每个元素 struct Member { let id: Int let username: String } // 再定义主结构体,包含所有属性 struct Team { let id: Int let name: String let team_id: Int let is_delete: Bool let created_at: String let members: [Member] // 这里就是Member类型的数组啦 let description: String? // 后面会说为什么用这个替代NSNull }
方式2:使用基础字典数组(快速但类型不安全)
如果不想自定义结构体,也可以直接用[[String: Any]]来表示数组,但这种方式在访问内部属性时需要手动类型转换,容易出错:
let id: Int = 17 let name: String = "" let team_id: Int = 4 let is_delete: Bool = false let created_at: String = "2018-04-30" let members: [[String: Any]] = [["id": 42, "username": "ie"]] let description: String? = nil
二、关于NSNull的使用疑问
在Swift里,不推荐用NSNull来表示空值,因为Swift本身有更贴合语言特性的「可选类型」。
- 原数据里
description是null,直接定义成let description: String?就可以了,空值的时候赋值为nil,既简洁又符合Swift的编码习惯。 - NSNull是Objective-C时代的产物,在Swift里使用它会增加不必要的类型转换成本,而且可选类型的语法更清晰。
如果一定要兼容Objective-C代码场景使用NSNull,也可以定义成let description: NSNull?,但日常Swift开发完全没必要这么做。
额外加分:用Codable自动解析JSON
如果你的数据是从JSON解析来的,建议让结构体遵循Codable协议,这样可以自动完成解析,不用手动赋值:
struct Team: Codable { let id: Int let name: String let team_id: Int let is_delete: Bool let created_at: String let members: [Member] let description: String? } struct Member: Codable { let id: Int let username: String } // 示例解析代码 let jsonString = """ {"id": 17, "name": "", "team_id": 4, "is_delete": false, "created_at": "2018-04-30", "members": [ {"id": 42, "username": "ie", } ], "description": null} """ if let jsonData = jsonString.data(using: .utf8) { do { let team = try JSONDecoder().decode(Team.self, from: jsonData) print(team.members[0].username) // 输出 "ie" } catch { print("解析失败:\(error)") } }
内容的提问来源于stack exchange,提问作者Nazar
相关产品推荐
相关产品推荐

