我想监听 $email 和 $password 的更改,然后将结果存储在 signInDisabled 中,但我不确定如何监听两者的更改。
@Published var email = ""
@Published var password = ""
var signInDisabled = true
var session : SessionListenerProtocol
private var cancellables = Set<AnyCancellable>()
init(){
// ???
$email, $password { email, password in
email == "" || password == ""
}
.assign(to: \.signInDisabled, on: self)
.store(in: &cancellables)
}
答案 0 :(得分:1)
我假设您使用 iOS14 作为最低目标。使用 .assign(to:on:)
并为其添加 self 时,会造成内存泄漏。 iOS 14 有一个更新,您可以改用 .assign(to: &)
。使用 .store(in: &cancellables)
时也不需要 .assign(to:)
。
要获得您正在寻找的行为,我建议您使用 .combineLatest
工具来读取您的两个值,并且不要忘记将 signInDisabled
设为 @Publisher
读作组合值。我还添加了一个 .removeDuplicates()
以避免组合管道在不需要时将多次相同的值设置为 signInDisabled
。
@Published var email = String()
@Published var password = String()
@Published var signInDisabled = true
init(){
$email
.combineLatest($password)
.map { $0.0 == String() || $0.1 == String() }
.removeDuplicates()
.assign(to: &$signInDisabled)
}