properties - validacion - valor predeterminado access
Establecer un valor predeterminado para una propiedad con definidor y definidor definidos (4)
En Swift, los captadores y los definidores se utilizan para las propiedades calculadas : no hay almacenamiento para la propiedad y, por lo tanto, en su caso, simpleDescription
no se puede configurar en un definidor.
Si necesita un valor predeterminado, use:
class SimpleClass {
var simpleDescription: String = "default description"
}
Si desea inicializar el uso:
class SimpleClass {
var simpleDescription: String
init (desc: String) {
simpleDescription = desc
}
}
Tengo una clase muy simple
class SimpleClass {
var simpleDescription: String {
get {
return self.simpleDescription
}
set {
self.simpleDescription = newValue
}
}
}
¿Cuál es la forma correcta de definir un valor predeterminado para la variable simpleDescription
?
Estableciendo un valor simple directamente:
var string1: String = "value" {
willSet {
print("willSet")
}
didSet {
print("didSet")
}
}
Configuración del resultado de un cierre calculado:
var string2: String = {
return "value"
}() {
willSet {
print("willSet")
}
didSet {
print("didSet")
}
}
La solución es fácil. Solo usa otra variable, devuélvela a getter.
var _simpleDescription = "Default value"
var simpleDescription: String {
get {
return self._simpleDescription
}
set {
self.simpleDescription = newValue
}
}
Si lo que desea es realizar una acción cada vez que se establece una variable o simplemente comprobar si el valor es correcto, puede utilizar los Property Observers
De los documentos:
Los observadores de propiedades observan y responden a cambios en el valor de una propiedad. Se llama a los observadores de propiedades cada vez que se establece el valor de una propiedad, incluso si el nuevo valor es el mismo que el valor actual de la propiedad.
Puedes usarlos así:
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to /(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added /(totalSteps - oldValue) steps")
}
}
}
}
EDITAR
Parece que esto no funciona al reemplazar propiedades heredadas. Aquí hay un ejemplo de lo que no puedes hacer:
class StepWihtoutCounter {
var totalSteps: Int = 0
}
class StepCounter: StepWihtoutCounter {
override var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to /(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added /(totalSteps - oldValue) steps")
}
}
}