如何在 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 协议。如果不符合可编码协议,您将收到编译时错误。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP