0Pricing
Swift Academy · 课时

处理可选类型与嵌套类型

安全地解码可选值和嵌套结构。

处理可选类型与嵌套类型 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

可选属性

当可选属性包装的类型符合 Codable 时,该属性自然也符合 Codable。缺少的 JSON 键会解码为 nil;存在的键则会正常解码。

import Foundation

struct User: Codable {
    var name: String
    var nickname: String?
}

let json = "{\"name\":\"Ada\"}"
let u = try JSONDecoder().decode(User.self, from: json.data(using: .utf8)!)
print(u.name, u.nickname ?? "-")

编码 nil 可选值

默认情况下,值为 nil 的可选值会完全从编码后的 JSON 中省略,从而生成更小的数据载荷。

import Foundation

struct User: Codable {
    var name: String
    var nickname: String?
}

let data = try JSONEncoder().encode(User(name: "Ada", nickname: nil))
print(String(data: data, encoding: .utf8)!)

显式空值解码为 nil

如果 JSON 为可选属性包含显式的 null,它会解码为 nil,而不会抛出错误。

import Foundation

struct User: Codable {
    var name: String
    var age: Int?
}

let json = "{\"name\":\"Ada\",\"age\":null}"
let u = try JSONDecoder().decode(User.self, from: json.data(using: .utf8)!)
print(u.age == nil)

嵌套 Codable 结构体

通过嵌套 Codable 类型来组合模型。外层类型会自动编码和解码内部类型。

import Foundation

struct Address: Codable { var city: String; var zip: String }
struct Person: Codable { var name: String; var address: Address }

let p = Person(name: "Lee", address: Address(city: "Rome", zip: "00100"))
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)

解码嵌套结构体

反向过程同样成立:嵌套的 JSON 对象会解码为嵌套结构体属性。

import Foundation

struct Address: Codable { var city: String }
struct Person: Codable { var name: String; var address: Address }

let json = "{\"name\":\"Lee\",\"address\":{\"city\":\"Rome\"}}"
let p = try JSONDecoder().decode(Person.self, from: json.data(using: .utf8)!)
print(p.address.city)

可选的嵌套类型

嵌套结构体本身也可以是可选值。如果缺少对应的键,整个嵌套值就会变成 nil。

import Foundation

struct Address: Codable { var city: String }
struct Person: Codable { var name: String; var address: Address? }

let json = "{\"name\":\"Lee\"}"
let p = try JSONDecoder().decode(Person.self, from: json.data(using: .utf8)!)
print(p.address?.city ?? "no address")

Codable 类型的数组

由符合 Codable 的元素类型组成的数组本身也符合 Codable。它会直接映射为由对象组成的 JSON 数组。

import Foundation

struct Tag: Codable { var name: String }
struct Post: Codable { var title: String; var tags: [Tag] }

let p = Post(title: "Hi", tags: [Tag(name: "swift"), Tag(name: "json")])
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)

解码结构体数组

解码由对象组成的 JSON 数组后,会得到一个包含类型明确值的 Swift 数组,您可以遍历它。

import Foundation

struct Tag: Codable { var name: String }

let json = "[{\"name\":\"a\"},{\"name\":\"b\"}]"
let tags = try JSONDecoder().decode([Tag].self, from: json.data(using: .utf8)!)
for t in tags { print(t.name) }

可选数组

可选数组可以区分“键缺失”(nil)和“键存在但数组为空”([])。这两种状态都有效且具有明确含义。

import Foundation

struct Box: Codable { var items: [String]? }

let a = try JSONDecoder().decode(Box.self, from: "{}".data(using: .utf8)!)
let b = try JSONDecoder().decode(Box.self, from: "{\"items\":[]}".data(using: .utf8)!)
print(a.items == nil, b.items == [])

深层嵌套结构

嵌套可以有多层,例如结构体中包含数组,数组中又包含结构体。Codable 会递归处理每一层。

import Foundation

struct Comment: Codable { var text: String }
struct Article: Codable { var title: String; var comments: [Comment] }
struct Feed: Codable { var articles: [Article] }

let feed = Feed(articles: [Article(title: "A", comments: [Comment(text: "hi")])])
let data = try JSONEncoder().encode(feed)
print(String(data: data, encoding: .utf8)!)

可选值与嵌套结构的往返转换

将所有内容结合起来:可选字段、嵌套结构体和数组都能完整保留,并顺利完成编码和解码的往返转换。

import Foundation

struct Address: Codable { var city: String }
struct Person: Codable {
    var name: String
    var address: Address?
    var hobbies: [String]
}

let p = Person(name: "Mo", address: Address(city: "Cairo"), hobbies: ["chess"])
let data = try JSONEncoder().encode(p)
let back = try JSONDecoder().decode(Person.self, from: data)
print(back.address?.city ?? "-", back.hobbies.first ?? "-")

快速检查:可选值与嵌套结构

测试您对可选和嵌套 Codable 类型的理解。

回顾:可选类型与嵌套类型

您已经学习了 Codable 如何处理更丰富的数据结构:

  • 可选属性能够容忍缺少的键和显式的 null,并解码为 nil。
  • 编码时,值为 nil 的可选值默认会被省略。
  • 嵌套的 Codable 结构体和数组会递归编码和解码。
  • 可选数组可以区分缺失(nil)和空数组([])。

常见问题解答

「处理可选类型与嵌套类型」课时是免费的吗?

是的 — 「处理可选类型与嵌套类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「处理可选类型与嵌套类型」这节课中我会学到什么?

安全地解码可选值和嵌套结构。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「处理可选类型与嵌套类型」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 遵循 Codable
  2. 使用 JSONEncoder 编码
  3. 使用 JSONDecoder 解码
  4. 处理可选类型与嵌套类型
← 返回 Swift Academy