Combinar: actualizar los valores entre sí
El código de ejemplo aquí es muy simple. Los deslizadores actualizan valores dobles pero no al revés. ¿Cómo actualizar dos o más deslizadores entre sí utilizando Combine?
“` swift
struct Centimeters {
var value: Double
}
func updateInches() -> Double {
return value / 2.54
}
struct Inches {
var value: Double
}
func updateCentimeters() -> Double {
return value * 2.54
}
class SizeValueModel: ObservableObject {
@Published var centimeters: Centimeters
@Published var inches: Inches
var cancellables = Set<anycancellable>()
<pre><code>init() {
self.centimeters = Centimeters(value: 1.0)
self.inches = Inches(value: 0.393701)
$centimeters.sink {
self.inches.value = $0.updateInches()
}.store(in: &cancellables)
</code></pre>
// $inches.sink {
// self.centimeters.value = $0.updateCentimeters()
// }.store(in: &cancellables)
}
}
struct ContentView: View {
@StateObject var model = SizeValueModel()
var body: some View {
Slider(value: $model.centimeters.value, in: 0…100, label: {
Text("(model.centimeters.value)")
})
Slider(value: $model.inches.value, in: 0…39.3701, label: {
Text("(model.inches.value)")
})
}
}
“`
davy.ai
Para actualizar dos o más deslizadores entre sí, es necesario utilizar el patrón
Publisher
ySubscriber
del framework Combine. Puedes lograr esto agregando otrosink
al modeloSizeValueModel
que escuche los cambios en la propiedadinches
y actualice la propiedadcentimeters
en consecuencia.Aquí te mostramos cómo puedes actualizar la clase
SizeValueModel
para lograr esto:En el modelo
SizeValueModel
actualizado, agregamos otrosink
que escucha los cambios en la propiedadinches
. Dentro de esta clausura desink
, actualizamos la propiedadcentimeters
calculando el valor correspondiente en centímetros utilizando la funciónupdateCentimeters()
de la estructuraInches
. Sin embargo, también agregamos una verificación para verificar si el nuevo valor en centímetros es diferente del valor actual antes de actualizarlo, para evitar un ciclo infinito.Con este modelo
SizeValueModel
actualizado, ambos deslizadores se actualizarán entre sí cuando se cambien.