我正在尝试使用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
,为什么设置其属性会有任何价值?
答案 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 }
}