Codable 类不符合 Decodable 协议

swift

1个回答

写回答

13039761573

2025-07-08 08:05

+ 关注

Swift
Swift

Codable 类不符合 Decodable 协议

Swift 编程语言中,我们经常需要在对象与数据之间进行转换。为了简化这一过程,Apple 引入了 Codable 协议,该协议可以让我们轻松地将对象编码为 JSON 格式的数据,或者将 JSON 数据解码为对象。Codable 协议实际上是由两个协议组成的:Encodable 和 Decodable。Encodable 用于将对象编码为数据,而 Decodable 用于将数据解码为对象。

然而,有时候我们可能只需要将 JSON 数据解码为对象,而不需要将对象编码为 JSON 数据。这时候,我们可以只遵守 Decodable 协议,但是却不能直接使用 Codable 类。这是因为 Codable 类不符合 Decodable 协议。

为什么 Codable 类不符合 Decodable 协议?

在 Codable 协议中,我们可以看到如下定义:

public typealias Codable = Decodable & Encodable

这意味着 Codable 类必须同时遵守 Decodable 和 Encodable 协议。而 Decodable 协议要求我们实现一个从 Decoder 对象中解码数据的方法,而 Encodable 协议则要求我们实现一个将数据编码为 Encoder 对象的方法。

这就导致了 Codable 类无法单独遵守 Decodable 协议,因为它本身已经包含了 Encodable 的要求。如果我们只需要将 JSON 数据解码为对象,而不需要将对象编码为 JSON 数据,那么遵守 Codable 协议就显得有些多余。

示例代码

为了更好地理解这个问题,让我们来看一个示例代码。假设我们有一个名为 Person 的类,该类包含了姓名和年龄属性。我们希望能够从 JSON 数据中解码出一个 Person 对象。

Swift

struct Person: Decodable {

let name: String

let age: Int

}

let JSon = """

{

"name": "Alice",

"age": 25

}

"""

let JSonData = JSon.data(using: .utf8)!

let decoder = JSONDecoder()

let person = try! decoder.decode(Person.self, from: JSonData)

print(person.name) // 输出:Alice

print(person.age) // 输出:25

在上面的代码中,我们定义了一个名为 Person 的结构体,并遵守了 Decodable 协议。然后,我们创建了一个包含了姓名和年龄的 JSON 数据,并使用 JSONDecoder 对象将其解码为 Person 对象。最后,我们打印出 Person 对象的姓名和年龄,可以看到成功地从 JSON 数据中解码出了 Person 对象。

尽管 Codable 类不符合 Decodable 协议,但我们仍然可以通过遵守 Decodable 协议来实现将 JSON 数据解码为对象的功能。这样一来,我们可以灵活地根据需求选择遵守 Codable 或 Decodable 协议,以便更好地满足我们的编程需求。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号