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

Sud*_*ara 4 swift combine

新的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可以关联故障类型吗?

rob*_*off 9

在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)


Man*_*awa 5

setFailureType(to:)可能是某些特殊情况的解决方案:

return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)

但请注意,罗布的回答通常更可取。这更简单,而且可能更快。