swift-我可以从自定义init方法调用结构默认memberwise init吗?

swift-我可以从自定义init方法调用结构默认memberwise init吗?,swift,swift-structs,Swift,Swift Structs,如果我创建的swift结构没有init,那么我可以调用编译器生成的默认memberwise初始化器,如下所示: struct OrderFill { let price:Int let qty: Int let timeStamp: NSDate } let o = OrderFill(price: 2, qty: 1, timeStamp: someDate) 我想做的是创建一个方便的init方法来从字典反序列化,然后链接到默认的memberwise init。差不多

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

struct OrderFill {
    let price:Int
    let qty: Int
    let timeStamp: NSDate
}
let o = OrderFill(price: 2, qty: 1, timeStamp: someDate)
我想做的是创建一个方便的init方法来从字典反序列化,然后链接到默认的memberwise 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)给了我一个错误“调用中的额外参数'qty',就好像它没有看到默认的memberwise,正在尝试递归调用
init(dictionary)

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

来自:

如果结构类型没有定义自己的自定义初始值设定项,则会自动接收成员初始值设定项

请注意,如果为值类型定义自定义初始值设定项,则将无法再访问该类型的默认初始值设定项(或memberwise初始值设定项,如果它是结构)。此约束可防止在更复杂的初始值设定项中提供的附加基本设置被意外使用其中一个自动初始值设定项所绕过的情况

因此答案是否定的。不能同时提供自定义初始值设定项和使用memberwise初始值设定项


这听起来像是在讨论扩展当前memberwise初始值设定项的功能。当然,这还没有结束,但是您仍然可以看一看,了解一下当前情况的局限性。

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

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)

可能看起来很粗糙,但书中也有<代码>注意:如果希望自定义值类型可以使用默认初始值设定项和成员初始值设定项以及自己的自定义初始值设定项进行初始化,请在扩展中编写自定义初始值设定项,而不是将其作为值类型原始实现的一部分。有关更多信息,请参阅扩展。这完全奇怪,它可以在扩展中工作,但不能在结构本身中工作。背后的逻辑是什么?