将assign(to:)与@Published变量组合



我有一个枚举在我的项目:

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)

最新更新