我正在尝试创建一个基类来初始化自定义JSON对象。我这样做的原因是我不必为每个类一遍又一遍地复制和粘贴相同的函数(updateResultsDictionary)。我现在遇到的一个问题与super init有关,我不断收到错误:
无法转换'[String:Any] .Type'类型的值(又名 'Dictionary.Type')到期望的参数类型'[String: 任何]'
如果我没有正确创建基类和子类,则此错误可能无关紧要。这是基类:
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对象的新方法,因此可能不正确。
答案 0 :(得分:0)
你有几个问题。
提供错误的行是因为您尝试将字典类型传递给超类init而不是字典实例。
你想:
super.init(resultsDictionary:[String: Any]())
()创建一个空字典实例。
此外,在覆盖init时,应始终调用超类init。即使在这种情况下,超类init是空的,但这是一种很好的做法,因为您可以在将来更改超类init。
此外,您可能需要考虑将init(resultsDictionary)
作为可用的初始化程序,然后您可以返回nil以指示无法解析字典而不是"清空&#34 ;对象。
<强>更新强>
我强烈建议您阅读(或重新阅读) Swift Book 中有关初始化的章节,但实质上您需要在调用超类初始化程序之前初始化子类属性,并确保所有路径在初始化程序中调用超类初始化程序。在您的第二个初始化程序中,初始化程序返回两个路径,因此您需要有两个超级初始化程序或重新构造代码。
您可以使用:
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)
}
}