Orion Edwards Orion Edwards - 4 months ago 17
Swift Question

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

If I create a swift struct with no

init
, then I can call the compiler-generated default memberwise initialiser, like so:

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


What I'd like to do is create a convenience init method to deserialise from a dictionary, which then chains to the default memberwise init. Something like

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)


When I try write this code though, the compiler (Xcode 7.2) gives me the error "Extra argument 'qty' in call" as though it doesn't see the default memberwise and is trying to recursively call
init(dictionary)


I can write my own memberwise init, or I can simply assign the properties directly from my
init(dictionary)
, but it'd be nice if I could chain the call. Is there any way to do this in swift?

Answer

Add your own initializer as an extension to your struct. Extensions cannot remove existing functionalities, so it will preserve struct's default initializer.

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)
Comments