我需要扩展struct
具有可用的初始化程序,并使用一个抛出初始化程序来调用该可用的初始化程序。我认为在Swift 3.1中没有优雅或明确的方法。
这样的事情:
extension Product: JSONDecodable {
public enum Error: Swift.Error {
case unableToParseJSON
}
init(decodeFromJSON json: JSON) throws {
guard let jsonObject = json as? JSONObject else {
throw Error.unableToParseJSON
}
// Meta-code
self.init(dictionary: jsonObject) ?? throw Error.unableToParseJSON
}
}
有一种优雅而干净的方式吗?
答案 0 :(得分:6)
在撰写问题时找到了一种半清洁方式:
extension Product: JSONDecodable {
public enum Error: Swift.Error {
case unableToParseJSON
}
init(decodeFromJSON json: JSON) throws {
guard let jsonObject = json as? JSONObject,
let initialized = type(of: self).init(dictionary: jsonObject)
else {
throw Error.unableToParseJSON
}
self = initialized
}
}
答案 1 :(得分:0)
以上是我见过的最好的方法,不错的工作。只是做一个小调整,使用Self
而不是type(of: self)
来保持整洁:
extension Product: JSONDecodable {
public enum Error: Swift.Error {
case unableToParseJSON
}
init(decodeFromJSON json: JSON) throws {
guard let jsonObject = json as? JSONObject,
let initialized = Self.init(dictionary: jsonObject)
else {
throw Error.unableToParseJSON
}
self = initialized
}
}