Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为自定义JSON对象创建基类_Ios_Json_Swift - Fatal编程技术网

Ios 为自定义JSON对象创建基类

Ios 为自定义JSON对象创建基类,ios,json,swift,Ios,Json,Swift,我试图创建一个基类来初始化自定义JSON对象。我这样做的原因是,我不必为每个类一次又一次地复制和粘贴同一个函数(updateResultsDictionary)。我现在遇到的一个问题与super init有关,我不断得到错误: 无法转换类型“[String:Any].type”(aka)的值 'Dictionary.Type')到预期的参数类型'[String: 任何]' 如果我没有正确地创建基类和子类,这个错误甚至可能无关紧要。这是基类: class JSONObject : NSObject

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

无法转换类型“[String:Any].type”(aka)的值 '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对象的新方法,因此可能不正确

你有几个问题

给出错误的那一行是因为您试图将字典类型传递给超类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]())所做的。您可以编辑您的问题以显示更新的代码吗?