[英]"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
}
}
如果出現問題,第一個將airbnbUS
和airbnbLocal
都設置為0
。 如果在字典中找不到該單個屬性的值,則第二個只會將每個屬性設置為0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.