我有很多网页,用户可以输入信息。它们可以用日期、数字或文本输入字段。
我试图接收所有的改变,在合并和获得他们的输出作为Encodable,以便我可以轻松地上传到网络的结果。
String是Encodable,所以我认为这很容易,但我不能让它结合起来。我得到一个编译器错误:
无法将“Publishers.Map”类型的返回表达式转换为返回“Published.Publisher”类型
有一个解决方法,我在SampleTextHandler中添加了另一个属性,即@Published var userTextEncodable: Encodable,但这不是我想要做的。
import Combine
protocol FieldResponseModifying {
var id: String { get }
var output: Published<Encodable>.Publisher { get }
}
struct SampleTextWrapper {
var output: Published<Encodable>.Publisher {
// Cannot convert return expression of type 'Publishers.Map<Published<String>.Publisher, Encodable>' to return type 'Published<Encodable>.Publisher'
handler.$userTextOutput.map { $0 as Encodable}
}
let id = UUID().uuidString
let handler = SampleTextHandler()
}
class SampleTextHandler {
@Published var userTextOutput = ""
init () { }
}发布于 2021-10-19 17:10:39
合并大量使用泛型。例如,使用map返回的类型是Publishers.Map<Published<Value>.Publisher, Encodable>。所以你可以这样申报你的财产:
var output: Publishers.Map<Published<Encodable>.Publisher, Encodable> {
handler.$userTextOutput.map { $0 as Encodable}
}但是现在您的属性的类型密切依赖于它的实现方式。如果更改实现,则必须更改类型。
相反,您几乎可以肯定地使用“类型橡皮”AnyPublisher,如下所示:
var output: AnyPublisher<Encodable, Never> {
handler.$userTextOutput
.map { $0 as Encodable }
.eraseToAnyPublisher()
}您可能会遇到另一个问题,因为您使用了Encodable存在论。当你碰到这个问题的时候,你会想发布另一个问题。
https://stackoverflow.com/questions/69618911
复制相似问题