WWDC 2019 中的错误 "Combine in Practice" CombineLatest 的代码示例?
Mistake in WWDC 2019 "Combine in Practice" Code example for CombineLatest?
我尝试遵循 WWDC 2019 的 Combine in Practice talk (starting at minute 26:00) or see slides 179 ff 的代码片段。但它不会编译并查看 API 某些部分对我来说没有意义(例如,使用 closure
类型的第三个参数调用 CombineLatest.init(A, B)
。我试图调整示例,以便他们编译。
问题第 1/2 部分:如果我误解了 WWDC 2019 代码片段,有人可以帮助我并告诉我吗?
第一个代码片段(幻灯片 179)
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: CombineLatest<Published<String>, Published<String>, String?> {
return CombineLatest($password, $passwordAgain) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
}
我只能将此片段至少 return 我 Publisher from
CombineLatest`
- 将
Publishers
枚举添加到 CombineLatest
的命名空间
- 删除尾随闭包
- 将
.Publisher
添加到 Published<String>
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: Publishers.CombineLatest<Published<String>.Publisher, Published<String>.Publisher> {
return Publishers.CombineLatest($password, $passwordAgain)
}
第二个代码片段(幻灯片 185)
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: Map<CombineLatest<Published<String>, Published<String>, String?>> {
return CombineLatest($password, $passwordAgain) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
.map { [=13=] == "password1" ? nil : [=13=] }
}
我可以编译这段代码:
- 执行第一个代码段列出的所有步骤
- 在
Map
前面加上Publishers.
- 将
<>
移动到正确的位置
- return 显式
Publishers.Map
并使用正确的参数 upstream:
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: Publishers.Map<Publishers.CombineLatest<Published<String>.Publisher, Published<String>.Publisher>, String?> {
return Publishers.Map(upstream: Publishers.CombineLatest($password, $passwordAgain)) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
或者当包含幻灯片中的 .map {}
时:
- 通过将 var 类型包装在另一个
Publishers.Map<..., String?>
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: Publishers.Map<Publishers.Map<Publishers.CombineLatest<Published<String>.Publisher, Published<String>.Publisher>, String?>, String?> {
return Publishers.Map(upstream: Publishers.CombineLatest($password, $passwordAgain)) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
.map { [=15=] == "password1" ? nil : [=15=] }
}
问题第 2/2 部分:执行此操作的快捷方式是什么?例如,通过使用这样的东西(不编译):
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: AnyPublisher<String?, Never> {
return Just($password)
.combineLatest($passwordAgain) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
.map{ [=16=] == "password1" ? nil : [=16=] }
.eraseToAnyPublisher()
}
第一季度:
WWDC 演示使用 API 当时存在。时间过去了 - API 改变了。就是这样。
第 2 季度:
尝试像下面这样...
var validatedPassword: AnyPublisher<String?, Never> {
return Publishers.CombineLatest($password, $passwordAgain)
.map { password, passwordRepeat in
guard password == passwordRepeat, password.count > 8 else { return nil }
return password
}
.map { ([=10=] ?? "") == "password1" ? nil : [=10=] }
.eraseToAnyPublisher()
}
我尝试遵循 WWDC 2019 的 Combine in Practice talk (starting at minute 26:00) or see slides 179 ff 的代码片段。但它不会编译并查看 API 某些部分对我来说没有意义(例如,使用 closure
类型的第三个参数调用 CombineLatest.init(A, B)
。我试图调整示例,以便他们编译。
问题第 1/2 部分:如果我误解了 WWDC 2019 代码片段,有人可以帮助我并告诉我吗?
第一个代码片段(幻灯片 179)
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: CombineLatest<Published<String>, Published<String>, String?> {
return CombineLatest($password, $passwordAgain) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
}
我只能将此片段至少 return 我 Publisher from
CombineLatest`
- 将
Publishers
枚举添加到CombineLatest
的命名空间
- 删除尾随闭包
- 将
.Publisher
添加到Published<String>
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: Publishers.CombineLatest<Published<String>.Publisher, Published<String>.Publisher> {
return Publishers.CombineLatest($password, $passwordAgain)
}
第二个代码片段(幻灯片 185)
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: Map<CombineLatest<Published<String>, Published<String>, String?>> {
return CombineLatest($password, $passwordAgain) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
.map { [=13=] == "password1" ? nil : [=13=] }
}
我可以编译这段代码:
- 执行第一个代码段列出的所有步骤
- 在
Map
前面加上Publishers.
- 将
<>
移动到正确的位置 - return 显式
Publishers.Map
并使用正确的参数upstream:
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: Publishers.Map<Publishers.CombineLatest<Published<String>.Publisher, Published<String>.Publisher>, String?> {
return Publishers.Map(upstream: Publishers.CombineLatest($password, $passwordAgain)) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
或者当包含幻灯片中的 .map {}
时:
- 通过将 var 类型包装在另一个
Publishers.Map<..., String?>
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: Publishers.Map<Publishers.Map<Publishers.CombineLatest<Published<String>.Publisher, Published<String>.Publisher>, String?>, String?> {
return Publishers.Map(upstream: Publishers.CombineLatest($password, $passwordAgain)) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
.map { [=15=] == "password1" ? nil : [=15=] }
}
问题第 2/2 部分:执行此操作的快捷方式是什么?例如,通过使用这样的东西(不编译):
@Published var password: String = ""
@Published var passwordAgain: String = ""
var validatedPassword: AnyPublisher<String?, Never> {
return Just($password)
.combineLatest($passwordAgain) { password, passwordAgain in
guard password == passwordAgain, password.count > 8 else { return nil }
return password
}
.map{ [=16=] == "password1" ? nil : [=16=] }
.eraseToAnyPublisher()
}
第一季度:
WWDC 演示使用 API 当时存在。时间过去了 - API 改变了。就是这样。
第 2 季度:
尝试像下面这样...
var validatedPassword: AnyPublisher<String?, Never> {
return Publishers.CombineLatest($password, $passwordAgain)
.map { password, passwordRepeat in
guard password == passwordRepeat, password.count > 8 else { return nil }
return password
}
.map { ([=10=] ?? "") == "password1" ? nil : [=10=] }
.eraseToAnyPublisher()
}