如何在 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" } ]
我们将此 JSON 文件命名为项目目录中的“sample.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 文件并将其转换为 Data 形式。以下是示例代码 -
import UIKit class CodableController: UIViewController { override func viewDidLoad() { super.viewDidLoad() decodeJSON() } func decodeJSON() { do { // creating path from the main bundle and getting data object from the path 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 协议。如果不符合可编码协议,您将收到编译时错误。