gpt4 book ai didi

swift - 'Publishers.Once' 的替代方案是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 22:04:00 25 4
gpt4 key购买 nike

新的 Xcode 11 beta 4 已删除 Publishers.Once来自 Combine 框架的结构。有什么选择?

Just似乎是可能的候选者,但是,它不能用于在返回类型为 AnyPublisher<Bool, Error> 的方法中返回发布者。作为关联 Failure输入 Just is Never .

例如在下面的方法中,我可以返回一个 Publishers.Once自相关Failure类型不是 Never .

func startSignIn() -> AnyPublisher<Void, Error> {
if authentication.provider == .apple {
let request = ASAuthorizationAppleIDProvider().createRequest()
request.requestedScopes = [.email, .fullName]

let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.performRequests()

return Publishers.Once(()).eraseToAnyPublisher()
} else {
return SignInManager.service.startSignIn(auth: authentication)
.map { (auth) -> Void in
self.authentication = auth
}.eraseToAnyPublisher()
}
}

但现在当我将其改回 Just 时我收到一个编译错误,提示 Just无法返回,因为该方法应返回具有关联 Failure 的发布者类型。

func startSignIn() -> AnyPublisher<Void, Error> {
if authentication.provider == .apple {
let request = ASAuthorizationAppleIDProvider().createRequest()
request.requestedScopes = [.email, .fullName]

let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.performRequests()

return Just(()).eraseToAnyPublisher() //Error Here
} else {
return SignInManager.service.startSignIn(auth: authentication)
.map { (auth) -> Void in
self.authentication = auth
}.eraseToAnyPublisher()
}
}

除了Publishers.Once 没有其他选择吗?哪些也可以有关联的故障类型?

最佳答案

在 Xcode 11 beta 4 中,Publishers.Once 被重命名为 Result.Publisher(其中 Result 是标准库的一部分)。所以改为这样写:

return Result.Publisher(()).eraseToAnyPublisher()

Apple 还为Result 添加了一个publisher 属性,如果您已经有一个Result,这会很方便:

let result: Result<Void, Error> = someFunction()
return result.publisher.eraseToAnyPublisher()

关于swift - 'Publishers.Once' 的替代方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57105699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com