如何在 Swift 中使枚举可解码?
在 Swift 中,您也可以使用 Codable 协议使枚举可解码。在 Swift 中,Codable 协议是一个非常强大的概念,它提供了解码和编码任何类型的值的灵活性。此外,您也可以使枚举可解码。您只需在自定义类型中定义一个枚举即可。为了使枚举可解码,枚举必须符合 Codable 协议。在本文中,我们将学习如何使用 Codable 协议使枚举在 Swift 中可解码
什么是 JSONDecoder 类?
然后使用 JSONDecoder 类将文件中的 JSON 数据解析为给定类型的实例,可以是类或结构。使用decode(_:from:)方法对JSON数据进行反序列化,然后返回生成的Type对象以访问Type对象的属性。
我们尝试使用Codable协议读取上面给出的相同JSON作为示例。在我们准备使用JSONDecoder()类解码JSON数据之前,让我们准备在解码时提供的模型类。
本例将遵循以下步骤。
步骤1 - 制作示例JSON
在此步骤中,我们将创建一个示例JSON并将其保存为Xcode项目中的" .json"文件。以下是我们将在本例中使用的JSON -
[
{
"title": "1904",
"artist": "The Tallest Man on Earth",
"year": "2012",
"type": "hindi"
},
{
"title": "#40",
"artist": "Dave Matthews",
"year": "1999",
"type": "english"
},
{
"title": "40oz to Freedom",
"artist": "Sublime",
"year": "1996",
"type": "english"
},
{
"title": "#41",
"artist": "Dave Matthews",
"year": "1996",
"type": "punjabi"
}
]
我们通过在项目目录中将其命名为"sample.json"来保存此 JSON 文件。在上面的 json 文件中,我们创建了一个字典对象数组。
第 2 步 - 设计结构
在此步骤中,我们将创建一个名为"Song"的结构以及用于存储对象信息的属性。确保枚举必须符合 Codable 协议,以使枚举可解码。
示例
struct Song: Codable {
public enum SongType: String, Codable {
case hindi = "hindi"
case english = "english"
case punjabi = "punjabi"
case tamil = "tamil"
case none = "none"
}
let title: String
let artist: String
let year: String
let type: SongType?
}
在上面的例子中,创建一个名为"Song"的结构体,并附带属性。你可以看到 Song 类型已经符合 Codable 协议。此外,定义一个名为"SongType"的枚举,其中包含不同的可能情况。你应该注意到,SongType 枚举也符合 Codable 协议,以便使其可解码。
步骤 3 - 解析 JSON 数据
在此步骤中,我们将解析本地目录中的 JSON 文件并将其保存到 Song 类型的数组中。你可以从主包中读取本地 JSON 文件并将其转换为数据形式。以下是示例代码 -
import UIKit
class CodableController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
decodeJSON()
}
func decodeJSON() {
do {
// 从主包创建路径并从路径获取数据对象
if let bundlePath = Bundle.main.path(forResource: "sample", ofType: "json"),
let jsonData = try String(contentsOfFile: bundlePath).data(using: .utf8) {
// decoding an array of songs
let songs = try JSONDecoder().decode([Song].self, from: jsonData)
// printing the type of song
songs.forEach {
song in print("Song type: \(song.type?.rawValue ?? "")")
}
}
} catch {
print(error)
}
}
}
在上面的示例中,我们创建了一个名为"CodableController"的视图控制器以及一个方法。在此方法中,我们从主包中读取本地 JSON 文件。之后,我们使用 JSONDecoder().decode() 方法解码 JSON 数据。我们将类型"[Song].self"传递给解码方法,如果成功解码,该方法将返回一个歌曲对象数组。
输出
Song type: hindi Song type: english Song type: english Song type: punjabi
结论
Swift 提供了 JSONDecoder 类来将 JSON 对象编码和解码为 Swift 的模型对象,反之亦然。我们有责任谨慎处理属性声明,否则会导致您产生错误。
为了使枚举在 Swift 中可解码,您还必须使枚举符合 Codable 协议。如果不符合 codable 协议,您将收到编译时错误。