如何在 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+ 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告