swift - 我可以从我的自定义初始化方法调用结构默认成员初始化吗?

swift - can I call a struct default memberwise init from my custom init method?

如果我创建一个没有 init 的 swift 结构,那么我可以调用编译器生成的默认成员初始化程序,如下所示:

struct OrderFill {
    let price:Int
    let qty: Int
    let timeStamp: NSDate
}
let o = OrderFill(price: 2, qty: 1, timeStamp: someDate)

我想做的是创建一个方便的 init 方法来从字典反序列化,然后链接到默认的成员初始化。像

struct OrderFill {
    let price:Int
    let qty: Int
    let timeStamp: NSDate

    init(dict:[String:AnyObject]) throws {
        self.init(
            price: dict["price"] as! Int
            qty: dict["qty"] as! Int
            timeStamp: try parseDate(dict["ts"] as! String)
    }
}
let o = OrderFill(someDict)

当我尝试编写这段代码时,编译器 (Xcode 7.2) 给我错误 "Extra argument 'qty' in call" 就好像它没有看到默认的成员方式并且正在尝试递归调用 init(dictionary)

我可以编写自己的 memberwise init,或者我可以直接从我的 init(dictionary) 中简单地分配属性,但如果我可以链接调用就更好了。在 swift 中有什么方法可以做到这一点吗?

来自the apple docs about Initialization

Structure types automatically receive a memberwise initializer if they do not define any of their own custom initializers

Note that if you define a custom initializer for a value type, you will no longer have access to the default initializer (or the memberwise initializer, if it is a structure) for that type. This constraint prevents a situation in which additional essential setup provided in a more complex initializer is circumvented by someone accidentally using one of the automatic initializers instead.

因此答案是。您不能提供自定义初始化程序 同时使用成员初始化程序。

听起来 this swift evolution proposal 谈论扩展当前成员初始化程序的功能。但是当然这还没有出来,但是你仍然可以看一下以了解当前情况的局限性。

添加您自己的初始化程序作为结构的扩展。扩展无法删除现有功能,因此它将保留结构的默认初始化程序。

struct OrderFill {
    let price: Int
    let qty: Int
    let timeStamp: NSDate
}

extension OrderFill {

    init(dict: [String: AnyObject]) throws {
        self.init(
            price: dict["price"] as! Int,
            qty: dict["qty"] as! Int,
            timeStamp: try parseDate(dict["ts"] as! String)
        )
    }
}

let o = OrderFill(someDict)