Ios 为自定义JSON对象创建基类
我试图创建一个基类来初始化自定义JSON对象。我这样做的原因是,我不必为每个类一次又一次地复制和粘贴同一个函数(updateResultsDictionary)。我现在遇到的一个问题与super init有关,我不断得到错误: 无法转换类型“[String:Any].type”(aka)的值 'Dictionary.Type')到预期的参数类型'[String: 任何]' 如果我没有正确地创建基类和子类,这个错误甚至可能无关紧要。这是基类:Ios 为自定义JSON对象创建基类,ios,json,swift,Ios,Json,Swift,我试图创建一个基类来初始化自定义JSON对象。我这样做的原因是,我不必为每个类一次又一次地复制和粘贴同一个函数(updateResultsDictionary)。我现在遇到的一个问题与super init有关,我不断得到错误: 无法转换类型“[String:Any].type”(aka)的值 'Dictionary.Type')到预期的参数类型'[String: 任何]' 如果我没有正确地创建基类和子类,这个错误甚至可能无关紧要。这是基类: class JSONObject : NSObject
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对象的新方法,因此可能不正确 你有几个问题 给出错误的那一行是因为您试图将字典类型传递给超类init而不是字典实例 你想要:
super.init(resultsDictionary:[String:Any]())
()创建一个空字典实例
此外,在重写init时,应该始终调用超类init。即使在这种情况下,超类init是空的,但这是一种很好的做法,因为将来可能会更改超类init
此外,您还可以考虑使用<代码> init(RESultBug字典)< /Cord>一个可失败的初始化器,然后您可以返回NIL来指示字典不能解析而不是“空”对象。 更新
我强烈建议您阅读(或重读)Swift手册中有关初始化的章节,但本质上您需要在调用超类初始化器之前初始化子类属性,并确保初始化器中的所有路径都调用超类初始化器。在第二个初始化器中,有两条路径可供初始化器返回,因此需要有两个超级初始化器或重新构造代码 您可以使用: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)
}
}
我刚刚尝试了你的方法,现在它返回了两个不同的错误:属性'self.airbnbUS'没有在super.init调用中初始化,super.init在从初始化器返回之前没有在所有路径上调用你读过Apple Swift书中关于初始化的章节吗?您需要确保始终调用超类初始值设定项,并且超类或子类初始值设定项初始化所有属性。我想这就是我使用super.init(resultsDictionary:[String:Any]())所做的。您可以编辑您的问题以显示更新的代码吗?