簡體   English   中英

“輸入‘有嗎?’ 嘗試從嵌套的 JSON 字典初始化對象時,沒有下標成員”錯誤

[英]"Type 'Any?' has no subscript members " error when trying to initialize objects from a nested JSON dictionary

我試圖通過刪除盡可能多的嵌套字典值來簡化我的代碼。 我當前的 JSON 數據自定義對象與此類似:

class JSONObject{

  var costDictionary: [String: Any]
  var airbnbDetails: [String: Any]
  var airbnbUS: Int
  var airbnbLocal: Int

 init(costDictionary: [String: Any], airbnbDetails: [String: Any], airbnbUS: Int, airbnbLocal: Int){
    self.costDictionary = costDictionary
    self.airbnbDetails = airbnbDetails
    self.airbnbUS = airbnbUS
    self.airbnbLocal = airbnbLocal
}

 init(resultsDictionary:[String: Any]){
    costDictionary = (resultsDictionary["cost"] as? [String: Any])!
    airbnbDetails = (costDictionary["airbnb_median"] as? [String: Any])!
    airbnbUS = (airbnbDetails["USD"] as? Int)!
    airbnbLocal = (airbnbDetails["CHF"] as? Int)!
}

這就是我想要實現的目標:

class JSONObject{

var airbnbUS: Int
var airbnbLocal: Int

 init(airbnbUS: Int, airbnbLocal: Int){
    self.airbnbUS = airbnbUS
    self.airbnbLocal = airbnbLocal
}

init(resultsDictionary:[String: Any]){

airbnbUS = (resultsDictionary["cost"]["airbnb_median"]["USD"] as? Int)
airbnbLocal = (resultsDictionary["cost"]["airbnb_median"]["CHF"] as? Int)
}

每次我嘗試底部代碼時,我都會得到一個

輸入“有嗎?” 沒有下標成員

2 個底部“airbnbUS”和“airbnbLocal”值的“init(resultsDictionary:[String: Any])”部分的錯誤。 有沒有辦法讓這個錯誤消失? 如果需要,這里是我用來更新對象值的函數:

static func updateResultsDictionary(urlExtension: String, completion:
    @escaping (JSONObject?) -> Void) {

    let nm = NetworkManager.sharedManager

    _ = nm.getJSONData(urlExtension: urlExtension) {data in

      guard let jsonDictionary = nm.parseJSONFromData(data), let

        resultDictionaries = jsonDictionary["result"] as?

        [[String : Any]] else {

          completion(nil)

          return
      }

      for resultsDictionary in resultDictionaries {// enumerate through dictionary
        let jsonInfo = JSONObject(resultsDictionary: resultsDictionary)

        completion(jsonInfo)
      }
    }
  }

resultsDictionary["cost"]Any類型。 您需要將其強制轉換為[String:Any]以便編譯器理解它是另一個字典。 嘗試這個:

init(resultsDictionary:[String: Any]){
    guard let cost = resultsDictionary["cost"] as? [String: Any],
        let airbnb = cost["airbnb_median"] as? [String : Any],
        let usd = airbnb["USD"] as? Int,
        let chf = airbnb["CHF"] as? Int else {
            //handle bad values
            airbnbUS = 0
            airbnbLocal = 0
            return
    }

    airbnbUS = usd
    airbnbLocal = chf
}

或者另一種方式:

init(resultsDictionary:[String: Any]){
    guard let cost = resultsDictionary["cost"] as? [String: Any],
        let airbnb = cost["airbnb_median"] as? [String : Any] else {
            //handle bad values
            airbnbUS = 0
            airbnbLocal = 0
            return
    }

    if let usd = airbnb["USD"] as? Int {
        airbnbUS = usd
    } else {
        //handle bad USD
        airbnbUS = 0
    }

    if let chf = airbnb["CHF"] as? Int {
        airbnbLocal = chf
    } else {
        //handle bad CHF
        airbnbLocal = 0
    }
}

如果出現問題,第一個將airbnbUSairbnbLocal都設置為0 如果在字典中找不到該單個屬性的值,則第二個只會將每個屬性設置為0

暫無
暫無

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

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