新的Xcode 11 beta 4已从Publishers.OnceCombine框架中删除了struct。有什么选择?
Just似乎是可能的候选者,但是,它不能用于返回类型为isAnyPublisher<Bool, Error>的关联Failure类型的方法中的返回发布者。Just 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()
}
}
Run Code Online (Sandbox Code Playgroud)
但是现在,当我将其更改回时,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()
}
}
Run Code Online (Sandbox Code Playgroud)
难道没有其他选择Publishers.Once可以关联故障类型吗?
在Xcode 11 beta 4中,Publishers.Once已重命名Result.Publisher(这Result是标准库的一部分)。所以改写这个:
return Result.Publisher(()).eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)
苹果还向中添加了一个publisher属性Result,如果您已经具有Result:
let result: Result<Void, Error> = someFunction()
return result.publisher.eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)
setFailureType(to:)可能是某些特殊情况的解决方案:
return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)
但请注意,罗布的回答通常更可取。这更简单,而且可能更快。
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |