使用SwiftyJSON的Swift Failable Initializer

时间:2016-02-09 13:43:15

标签: json swift initialization swifty-json failable

我正在尝试使用SwiftyJSON中的一些JSON初始化一个简单的数据模型对象。我希望初始化程序失败,如果不存在任何所需的JSON值,则返回nil。这是我的代码:

class ProductCategory: NSObject {

  let id: String
  let sortOrder: Int
  let name: String
  let imageURL: String
  let ranges: [String]

  init?(json: JSON) {
    if let jsonID = json["id"].string,
       jsonSortOrder = json["sortOrder"].int,
       jsonName = json["name"].string,
       jsonImageURL = json["imageURL"].string {
      id = jsonID
      sortOrder = jsonSortOrder
      name = jsonName
      imageURL = jsonImageURL
      ranges = json["ranges"].arrayValue.map { $0.string! }
    } else {
      return nil
    }
  }
}

我希望这可行。如果我们没有点击所有这些json值,只需返回nil并保释。但是,我在return nil上收到错误,说明:

  

之前必须初始化类实例的所有存储属性   从初始化程序返回nil。

我很困惑:如果出现问题,我可以挽救它而不设置它,这是不是一个可用的初始化器的重点?返回的对象是nil,为什么设置其属性会有任何价值?

2 个答案:

答案 0 :(得分:3)

所以这就是我最终做的事情--Greg是对的,但我最终切换到了struct

struct ProductCategory {

    let id: String
    let sortOrder: Int
    let name: String
    let imageURL: String
    let ranges: [String]

    init?(json: JSON) {
        guard let jsonID = json["id"].string,
              let jsonSortOrder = json["sortOrder"].int,
              let jsonName = json["name"].string,
              let jsonImageURL = json["image"].string else {
            return nil
        }

        self.id = jsonID
        self.sortOrder = jsonSortOrder
        self.name = jsonName
        self.imageURL = jsonImageURL
        self.ranges = json["ranges"].arrayValue.map { $0.string! }
    }

}

答案 1 :(得分:2)

Failable Initializers for Classes

“但是,对于类,只有在该类引入的所有存储属性都设置为初始值并且已进行任何初始化程序委派之后,可用的初始化程序才会触发初始化失败。”

所以

init?(json: JSON) {
    self.id = json["id"].string
    self.sortOrder = json["sortOrder"].int
    ...
    if ... { return nil }
}