gpt4 book ai didi

ios - 为什么这会在 Combine 中产生编译器错误?

转载 作者:行者123 更新时间:2023-11-28 20:49:23 25 4
gpt4 key购买 nike

只是想在我的新项目中实现 SwiftUI 和 Combine。但坚持这一点:

    func task() -> AnyPublisher<Int, Error> {

return AnyPublisher { subscriber in

subscriber.receive(Int(arc4random()))
subscriber.receive(completion: .finished)
}
}

这会产生以下编译器错误:

类型“(_) -> ()”不符合协议(protocol)“发布者”

为什么?

更新

其实这里的Random只是一个例子。真正的代码看起来像这样:

 func task() -> AnyPublisher<SomeCodableModel, Error> {

return AnyPublisher { subscriber in

BackendCall.MakeApiCallWithCompletionHandler { response, error in

if let error == error {

subscriber.receive(.failure(error))
} else {

subscriber.receive(.success(response.data.filter))
subscriber.receive(.finished)
}
}
}
}

不幸的是,我无法访问 BackendCall API,因为它是私有(private)的。这是一种伪代码,但它非常接近真实代码。

最佳答案

您不能使用接受订阅者 的闭包来初始化AnyPublisher。您只能从 Publisher 初始化 AnyPublisher。如果你想创建一个自定义的 Publisher,它在接收到订阅者后立即发出一个随机的 Int,然后完成,你可以创建一个符合 的自定义类型Publisher 并在所需的方法 receive(subscriber:) 中,执行您在闭包中所做的事情。

struct RandomNumberPublisher: Publisher {
typealias Output = Int
typealias Failure = Never

func receive<S>(subscriber: S) where S : Subscriber, Failure == S.Failure, Output == S.Input {
subscriber.receive(Int.random(in: 0...Int.max))
subscriber.receive(completion: .finished)
}
}

然后在您的 task 方法中,您只需创建一个 RandomNumberPublisher,然后键入 erase 即可。

func task() -> AnyPublisher<Int, Never> {
return RandomNumberPublisher().eraseToAnyPublisher()
}

关于ios - 为什么这会在 Combine 中产生编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59360660/

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