SwiftUI and Combine - Обновление переменной в модели представления при изменении другого - PullRequest
1 голос
/ 26 февраля 2020

В настоящее время я создаю небольшое приложение с одним видом, чтобы помочь изучить еще немного SwiftUI. Приложение представляет собой простое приложение для расчета значений в соотношении. У меня есть 4 основных переменных на данный момент, левая и правая части отношения, а также первое и второе значения, которые будут рассчитываться в соотношении. Изначально каждое из них было сохранено как @State свойства:

@State var leftSide = Double()
@State var rightSide = Double()
@State var value1 = Double()
@State var value2 = Double()

В приложении есть 4 ползунка, которые позволяют изменять каждую переменную независимо друг от друга. Теперь я хочу, чтобы изменение переменной value1 также обновляло value2 в соответствии с установленным пользователем соотношением. Я считаю, что для этого мне нужно использовать Combine, но у меня нет большого опыта работы с фреймворком.

Для начала я переместил переменные в класс ObservableObject:

final class UserData: ObservableObject {
    @Published var leftSide = Double()
    @Published var rightSide = Double()
    @Published var value1 = Double()
    @Published var value2 = Double()
}

Я обновил свой основной вид с помощью @ObservedObject var userData = UserData(), чтобы я мог получить доступ к переменным в моем представлении, и это работает отлично

Теперь я хочу обновить переменные value1 и value2, когда другие изменятся. Из прочитанного мною чтения я думаю, что мне нужно использовать подписчика, но я не могу найти ничего о том, как настроить это с помощью свойства @Published. Правильно ли я сделал это или есть лучший способ сделать это?

1 Ответ

1 голос
/ 27 февраля 2020

В данный момент у меня есть 4 основные переменные, левая и правая части отношения, а также первое и второе значения , которые будут рассчитаны в соотношении

* 1006. * Итак, почему вы не объявляете его как вычисляемые переменные?
final class UserData: ObservableObject {
    @Published var leftSide = 0.0
    @Published var rightSide = 0.0
    var value: Double {
        // perform the calculation here
        ...
    }
}

Если вы хотите изменить значение независимо (связать его с компонентом SwiftUI) и изменить значение в случае изменения leftSide или rightSide, использовать willSet или даже didSet

final class UserData: ObservableObject {
    @Published var leftSide = 0.0 {
        willSet {
           // update value 
            value = f(newValue)
        }
        didSet {
           // update value
           value = f(oldValue)
        }
    }
    @Published var rightSide = 0.0
    @Published var value = 0.0
    func f(_ v: Double)->Double {
        ......
    }
}
...