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 fromCombineLatest`

@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=] }
}

我可以编译这段代码:

@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 {} 时:

@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()
}