我浏览了“Combine 简介”的 WWDC 视频,据说每当更新发布者值时,都会调用并更新 CombineLatest。但是我创建的代码片段很奇怪。
class Mango {
var enableButton = false
@Published var userName = "admin"
@Published var password = "poweruser"
@Published var passwordAgain = "poweruser"
var validatePassword: AnyCancellable {
Publishers.CombineLatest($password, $passwordAgain).map { (password, reenterpass) -> String? in
print("Is Password Same to \(password)? :", password == reenterpass)
guard password == reenterpass else { return nil }
return password
}.eraseToAnyPublisher()
.map { (str) -> Bool in
print("In Map", str != nil)
guard str != nil else { return false }
return true
}.assign(to: \.enableButton, on: self)
}
init() {
validatePassword
}
func checkSub() {
print("1. Is password same? ->",enableButton)
password = "nopoweruser"
print("2. Is password same? ->",enableButton)
}
}
当我初始化并调用更新发布者“密码”的函数 checkSub() 时,不会调用 CombineLatest。为什么它的行为很奇怪?
输入:
let mango = Mango()<br>
mango.checkSub()
输出:
Is Password Same to poweruser? : true
In Map true
1. Is password same? -> true
2. Is password same? -> true