如果我创建一个没有的swift结构init
,那么我可以调用编译器生成的默认成员初始化器,如下所示:
struct OrderFill { let price:Int let qty: Int let timeStamp: NSDate } let o = OrderFill(price: 2, qty: 1, timeStamp: someDate)
我想要做的是创建一个方便的init方法来从字典反序列化,然后字典链接到默认的成员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)在调用中给出了错误"额外参数'数量',好像它没有看到默认的成员并试图递归调用 init(dictionary)
我可以编写自己的成员init,或者我可以直接从我的分配属性init(dictionary)
,但如果我可以链接调用它会很好.有没有办法在swift中做到这一点?
添加自己的初始化程序作为结构的扩展.扩展无法删除现有功能,因此它将保留struct的默认初始值设定项.
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)
来自关于初始化的苹果文档:
如果结构类型没有定义任何自己的自定义初始值设定项,它们会自动接收成员初始值设定项
和
请注意,如果为值类型定义自定义初始值设定项,则您将无法再访问该类型的默认初始值设定项(或成员初始值设定项,如果它是结构).这种约束可以防止人们意外地使用其中一个自动初始化程序而避免在更复杂的初始化程序中提供的其他基本设置.
因此答案是否定的.您无法提供自定义初始值设定项并同时使用成员初始值设定项.
听起来这个迅速的演化提议 谈论扩展当前成员初始化程序的功能.但当然还没有结束,你仍然可以看一下当前情况的局限性.