Swift:从抛出初始化程序中调用可用的初始化程序?

rsh*_*hev 1 ios swift

我需要扩展一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

有一种优雅而干净的方式吗?

rsh*_*hev 7

在写这个问题时找到了一个半干净的方法来做到这一点:

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
    }
}
Run Code Online (Sandbox Code Playgroud)