structs enum swift swift-structs

enum - swift struct inheritance



swift: ¿puedo llamar a una estructura por defecto memberwise init desde mi método de inicio personalizado? (2)

Agrega tu propio inicializador como una extensión a tu estructura. Las extensiones no pueden eliminar las funcionalidades existentes, por lo que conservará el inicializador predeterminado de la estructura.

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)

Si creo una estructura rápida sin init , entonces puedo llamar al inicializador de modo de miembro predeterminado generado por el compilador, así:

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

Lo que me gustaría hacer es crear un método de inicio de conveniencia para deserializar desde un diccionario, que luego se encadena al inicio por defecto de memberwise. Algo como

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)

Sin embargo, cuando intento escribir este código, el compilador (Xcode 7.2) me da el error "Argumento adicional ''qty'' en la llamada" como si no viera el valor predeterminado de miembro y está tratando de llamar recursivamente a init(dictionary)

Puedo escribir mi propio init de memberwise, o simplemente puedo asignar las propiedades directamente desde mi init(dictionary) , pero sería bueno si pudiera encadenar la llamada. ¿Hay alguna manera de hacer esto de forma rápida?


De los documentos de Apple sobre Inicialización :

Los tipos de estructura reciben automáticamente un inicializador de memberwise si no definen ninguno de sus propios inicializadores personalizados

y

Tenga en cuenta que si define un inicializador personalizado para un tipo de valor, ya no tendrá acceso al inicializador predeterminado (o al inicializador de miembros, si es una estructura) para ese tipo. Esta restricción previene una situación en la que una configuración esencial adicional provista en un inicializador más complejo es eludida por alguien que accidentalmente usa uno de los inicializadores automáticos.

Por lo tanto la respuesta es NO . No puede proporcionar un inicializador personalizado y utilizar el inicializador de memberwise al mismo tiempo.

Parece que esta propuesta de evolución rápida habla sobre la extensión de las capacidades del inicializador actual de memberwise. Pero, por supuesto, todavía no está disponible, sin embargo, puede echar un vistazo para aprender un poco acerca de cuáles son las limitaciones de la situación actual.