代码之家  ›  专栏  ›  技术社区  ›  Luke

SwiftyJSON的Swift Failable Initializer

  •  2
  • Luke  · 技术社区  · 9 年前

    我试图用来自的JSON初始化一个简单的数据模型对象 SwiftyJSON .I希望初始化程序失败,如果没有任何所需的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 回复  |  直到 9 年前
        1
  •  3
  •   Luke    9 年前

    所以我最终做的是格雷格是对的,但我最终改成了 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! }
        }
    
    }
    
        2
  •  2
  •   Greg Leszek    9 年前

    Failable Initializers for Classes :

    但是,对于类,只有在该类引入的所有存储属性都设置为初始值并且初始值设定项委托发生后,可失败的初始值设定器才能触发初始化失败

    所以

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