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

时间:2017-04-07 10:58:45

标签: 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
    }
}

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

2 个答案:

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