如何在 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 协议。如果不符合可编码协议,您将收到编译时错误。

更新于:2023 年 4 月 4 日

1K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告