que objetos inicializadores herencia clases swift swift2 guard-statement

objetos - Protección al configurar múltiples propiedades de clases en Swift 2



que es self en swift (1)

Es bastante trivial hacer algo como esto:

class Collection { init(json: [String: AnyObject]){ guard let id = json["id"] as? Int, name = json["name"] as? String else { print("Oh noes, bad JSON!") return } } }

En ese caso, usamos let para inicializar variables locales. Sin embargo, modificarlo para usar las propiedades de clase hace que falle:

class Collection { let id: Int let name: String init(json: [String: AnyObject]){ guard id = json["id"] as? Int, name = json["name"] as? String else { print("Oh noes, bad JSON!") return } } }

Se queja de que debe usarse let o var pero obviamente ese no es el caso. ¿Cuál es la forma correcta de hacer esto en Swift 2?


En el if let esté disponible, está desenvolver los valores de las variables locales opcionales como nuevas. No puede desenvolver en las variables existentes. En su lugar, debe desenvolver, luego asignar ie

class Collection { let id: Int let name: String init?(json: [String: AnyObject]){ // alternate type pattern matching syntax you might like to try guard case let (id as Int, name as String) = (json["id"],json["name"]) else { print("Oh noes, bad JSON!") self.id = 0 // must assign to all values self.name = "" // before returning nil return nil } // now, assign those unwrapped values to self self.id = id self.name = name } }

Esto no es específico de las propiedades de la clase: no se puede vincular condicionalmente a ninguna variable, por ejemplo, esto no funciona:

var i = 0 let s = "1" if i = Int(s) { // nope }

En cambio, debes hacer:

if let j = Int(s) { i = j }

(aunque, por supuesto, en este caso, sería mejor let i = Int(s) ?? 0 )