如何在 Swift 中使枚举可解码?

swiftserver side programmingprogramming更新于 2025/5/31 6:37:17

在 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 协议,您将收到编译时错误。



相关文章



关于我们 | 隐私条款 | 学习路线
返回顶部