Я играл с SwiftUI и Combine и чувствую, что, возможно, есть способ получить существующие свойства @State в представлении и создать новый.
Например, у меня есть View для создания пароля, который содержит пароль и поле passwordConfirm для пользователя. Я хочу взять эти два свойства @State и получить новое @State, которое я могу использовать в своем представлении, которое подтверждает, является ли ввод действительным. Так что для простоты: не пустой и не равный.
В документах Apple говорится, на привязке есть издатель , хотя я никак не могу его удержать.
Это неработающий псевдокод:
import SwiftUI
import Combine
struct CreatePasswordView : View {
@State var password = ""
@State var confirmation = ""
lazy var valid = {
return self.$password.publisher()
.combineLatest(self.$confirmation)
.map { $0 != "" && $0 == $1 }
}
var body: some View {
SecureField($password, placeholder: Text("password"))
SecureField($confirmation, placeholder: Text("confirm password"))
NavigationButton(destination: NextView()) { Text("Done") }
.disabled(!valid)
}
}
Кто-нибудь найден. подходящий способ сделать это / если это возможно?
ОБНОВЛЕНИЕ Бета 2:
Начиная с бета-версии 2 издатель доступен, поэтому первая половина этого кода теперь работает. Вторая половина использования получающегося в результате издателя в представлении, которое я до сих пор не выяснил (disabled(!valid)
).
import SwiftUI
import Combine
struct CreatePasswordView : View {
@State var password = ""
@State var confirmation = ""
lazy var valid = {
Publishers.CombineLatest(
password.publisher(),
confirmation.publisher(),
transform: { String($0) != "" && $0 == $1 }
)
}()
var body: some View {
SecureField($password, placeholder: Text("password"))
SecureField($confirmation, placeholder: Text("confirm password"))
NavigationButton(destination: NextView()) { Text("Done") }
.disabled(!valid)
}
}
Спасибо.