简体   繁体   English

SwiftyJSON的Swift失败初始化器

[英]Swift Failable Initializer with SwiftyJSON

I'm trying to initialise a simple data model object with some JSON from SwiftyJSON . 我正在尝试使用来自SwiftyJSON JSON初始化一个简单的数据模型对象。 I'd like the initialiser to fail and return nil if any of the required JSON values aren't present. 我希望初始化程序失败,如果不存在任何必需的JSON值,则返回nil。 Here's my code: 这是我的代码:

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
    }
  }
}

I'd expect this to work. 我希望这能奏效。 In the event that we didn't hit all those json values, simply return nil and bail out. 如果我们没有击中所有这些json值,只需返回nil并退出即可。 However, I get an error on the return nil , stating: 但是,在return nil出现错误,指出:

All stored properties of a class instance must be initialized before returning nil from an initializer. 从初始化器返回nil之前,必须初始化类实例的所有存储属性。

I'm confused: isn't the point of a failable initializer that I can bail out without setting it up if something goes wrong? 我很困惑:难道不是初始化失败的关键,我可以在出现问题时无需设置就可以纾困吗? The object returned would be nil , why would there be any value in setting up its properties? 返回的对象将为nil ,为什么在设置其属性时会有任何价值?

So here's what I ended up doing – Greg was right but I ended up switching to a struct as a result: 所以这就是我最终要做的– 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! }
    }

}

Failable Initializers for Classes : 类的失败初始化器

"For classes, however, a failable initializer can trigger an initialization failure only after all stored properties introduced by that class have been set to an initial value and any initializer delegation has taken place." “但是,对于类而言,只有在该类引入的所有存储的属性都设置为初始值并且已经进行了任何初始化程序委托之后,可失败的初始化程序才可以触发初始化失败。”

So 所以

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM