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
)