gpt4 book ai didi

ios - 为自定义 JSON 对象创建基类

转载 作者:行者123 更新时间:2023-11-30 12:46:17 26 4
gpt4 key购买 nike

我正在尝试创建一个基类来初始化自定义 JSON 对象。我这样做的原因是这样我就不必为每个类一遍又一遍地复制和粘贴相同的函数(updateResultsDictionary)。我现在遇到的问题与 super 初始化有关,我不断收到错误:

Cannot convert value of type '[String : Any].Type' (aka 'Dictionary.Type') to expected argument type '[String : Any]'

如果我没有正确创建基类和子类,这个错误可能并不重要。这是基类:

class JSONObject : NSObject {

init(resultsDictionary:[String: Any]){}


//Function used for all child classes to update object values
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)

}
}
}
}

这是一个示例子类:

class AirBnBObject: JSONObject {

var airbnbUS: Int
var airbnbLocal: Int


init(airbnbUS: Int, airbnbLocal: Int){
super.init(resultsDictionary:[String: Any]())

self.airbnbUS = airbnbUS
self.airbnbLocal = airbnbLocal
}

override 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 {
airbnbUS = 0
airbnbLocal = 0
return
}

airbnbUS = usd
airbnbLocal = chf
}
}

这是一种编写 json 对象的新方法,因此可能不正确。

最佳答案

您有几个问题。

出现错误的行是因为您试图将字典类型传递给父类(super class)init,而不是字典实例

你想要:super.init(resultsDictionary:[String: Any]())

() 创建一个空字典实例。

此外,当您重写 init 时,您应该始终调用父类(super class) init。尽管在这种情况下父类(super class) init 是空的,但这也是一个很好的做法,因为您将来可能会更改父类(super class) init。

此外,您可能需要考虑将 init(resultsDictionary) 设为失败初始化程序,因为这样您可以返回 nil 来指示字典无法解析,而不是“空”的物体。

更新

我强烈建议您阅读(或重新阅读)Swift Book中有关初始化的章节,但本质上您需要在调用父类(super class)初始化程序之前初始化子类属性,并确保所有路径在初始化程序中调用父类(super class)初始化程序。在第二个初始化程序中,初始化程序返回有两条路径,因此您需要有两个 super 初始化程序或重新构造代码。

您可以使用:

class JSONObject : NSObject {

init(resultsDictionary:[String: Any]){}


//Function used for all child classes to update object values

}

class AirBnBObject: JSONObject {

var airbnbUS: Int
var airbnbLocal: Int


init(airbnbUS: Int, airbnbLocal: Int){


self.airbnbUS = airbnbUS
self.airbnbLocal = airbnbLocal

super.init(resultsDictionary:[String: Any]())
}

override 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 {
airbnbUS = 0
airbnbLocal = 0
super.init(resultsDictionary: resultsDictionary)
return
}

airbnbUS = usd
airbnbLocal = chf
super.init(resultsDictionary: resultsDictionary)
}
}

关于ios - 为自定义 JSON 对象创建基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41599562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com