簡體   English   中英

在Swift中將JSON轉換為模型值

[英]Converting a JSON into a Model Value in Swift

在我尋求更多關於Swift的知識的過程中,我正在尋找改進我的應用程序的方法,並注意到我正在做出假設的一些地方,也許我不應該這樣做。

在創建一個新對象時,假設一個'學生',他們需要諸如名字( String ),年齡( Int )和得分( Float )之類的東西。 我從JSON文件中讀取這些內容,並將它們放入如下對象中:

// note, details is a [String:Any] type
let name = details["name"] as! String
let age = details["age"] as! Int 
let score = Float(details["score"])
self.student = Student(name: name, tutor_group: tutor_group, score: score)

所以我的問題如下; 1.我應該如何修改我的代碼來檢查如果一個值不是一個數字,它應該在哪里,變量只是nil ,甚至更好0? 2.如果詞典中的鍵不存在怎么辦? 3.有不同的方法,如果是這樣,哪種方法最佳?

請注意 ,我希望保持此代碼盡可能短 - if每行的if / else語句不是我正在尋找的。

非常感謝你提前!

Swift團隊建議的解決方案

最近Apple 描述了面對這個問題的建議方法。

您可以通過這種方式定義Student結構(或類)

struct Student {

    let name: String
    let age: Int
    let score: Float

    init?(json: [String:Any]) {
        guard
            let name = json["name"] as? String,
            let age = json["age"] as? Int,
            let score = json["score"] as? Float
            else { return nil }
        self.name = name
        self.age = age
        self.score = score
    }
}

這種方法的好處

  1. 封裝邏輯的JSON轉換成Student里面Student結構本身
  2. 如果JSON不包含有效數據(例如,沒有具有有效Int age字段),則初始化程序失敗並返回nil 這意味着沒有辦法創建一個缺少字段的Student (這是一件好事),這種情況不會導致崩潰。

更多

我上面鏈接的帖子還描述了一種更高級的方法,其中缺少字段/值會引發異常。 但是,如果您不需要記錄(或通知調用方)為什么初始化失敗,則不需要此操作。

所以我的問題如下; 1.我應該如何修改我的代碼來檢查如果一個值不是一個數字,它應該在哪里,變量只是零,甚至更好0? 2.如果詞典中的鍵不存在怎么辦? 3.有不同的方法,如果是這樣,哪種方法最佳?

let age = (details["age"] as? Int) ?? 0
  • 在所有情況下, age將具有Int類型
  • 如果密鑰不存在, details["age"]將返回nilas? Int as? Int將返回Int? 值為nilnil合並算子 ?? 將值設置為0
  • 如果類型不是Int ,則條件轉換as? Int as? Int將返回nil ,值將設置為0
  • 在預期的情況下, age將具有存儲在details["age"]Int值。

對於其他領域:

let name = (details["name"] as? String) ?? ""

// If score is stored as a String
let score = Float(details["score"] as? String ?? "") ?? 0

要么

// If score is stored as a number
let score = (details["score"] as? Float) ?? 0

你可以使用后衛:

guard let name = details["name"] as? String else {
   return
}
print("\(name)")

謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM