我有一个枚举在我的项目:
enum Remote<Content> {
case .notAsked
case .loading
case .loaded(Content)
case .failed(Error)
}
我有一个类:
class MyViewModel: ObservableObject {
@Published var content: Remote<ContentStruct> = .notAsked
func fetchContent() {
content = .loading
service.fetchContent()
.receive(on: queue)
.map(Remote<ContentStruct>.loaded)
.catch { error in Just(.failed(error)) }
.assign(to: &self.content)
}
}
但是这个向我抱怨:
Cannot convert value of type 'Remote<ContentStruct>' to expected argument type 'Published<Remote<ContentStruct>>.Publisher'
我可以这样修改:
func fetchContent() {
content = .loading
service.fetchContent()
.receive(on: queue)
.map(Remote<ContentStruct>.loaded)
.catch { error in Just(.failed(error)) }
.assign(to: .content, on: self)
.store(in: &cancellables)
}
这样就可以正确赋值了。但我不明白为什么我不能在这里用.assign(to: keyPath)
函数?
我需要做一些不同的事情吗?我们最近才更新到至少支持iOS14,所以由于内存泄漏之前没有使用assign(to:
,现在我只是不确定这是如何工作的。
assign(to:)
需要Published.Publisher
作为输入。因此,您需要从Publisher
属性包装器传递发布者,您可以使用$
前缀访问它。
.assign(to: &$content)