为自定义JSON对象创建基类

时间:2017-01-11 19:52:04

标签: ios json swift

我正在尝试创建一个基类来初始化自定义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对象的新方法,因此可能不正确。

1 个答案:

答案 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)
    }
}