如何让CoreData对象符合Equatable协议?

问题描述 投票:0回答:1

当我在 ScrollView 上使用

.animation(.spring(), value: favoriteArticles)
来启用删除或添加项目的动画时。
favoriteArticles
是从CoreData获取的数据。

然后我得到了这个错误

Instance method 'animation(_:value:)' requires that 'FetchedResults<Article>' conform to 'Equatable'
,我怎样才能让CoreData对象确认Equatable协议。

            Section {
                ScrollView(.vertical, showsIndicators: false) {
                    ForEach(favoriteArticles) { article in
                        favoriteArticleRow(article: article)
                    }
                }
                .padding(.horizontal, 16)
                .padding(.top, 14)
                .confirmationDialog("This favorite will be deleted.", isPresented: $showDeleteOneAlert, titleVisibility: .visible) {
                    Button("Delete", role: .destructive) {
                        print("~ delete \(String(describing: selectedFavorite?.text))")
                        guard let selectedFavorite = selectedFavorite else { return }
                        delete(article: selectedFavorite)
                        // If favorites is empty, show control panel, and reset showDeleteButton
                        if favoriteArticles.isEmpty {
                            showDeleteButton.toggle()
                            homeViewState.showControlPanel.toggle()
                        }
                    }
                }
                .animation(.spring(), value: favoriteArticles)
animation swiftui core-data
1个回答
0
投票

CoreData 对象是

NSObject
,其中 do 符合
Equatable
。不符合FetchedResult
的是
Equatable

如果您只想以动画方式添加和删除最喜欢的文章,则可以使用

favoriteArticles.count
作为
value:
参数。这是假设在每笔交易中,仅添加或仅删除收藏的文章。

如果在同一笔交易中一篇文章可以被收藏,而另一篇文章则未被收藏,则交易不会被动画化。

favoriteArticles.count
毕竟没有改变。为了处理这个问题,您需要将所有获取的结果加载到内存中并比较它们的 id。例如
favoriteArticles.map(\.objectID)
。这可能会很昂贵,具体取决于有多少收藏的文章。

或者,如果您知道某篇文章何时会被收藏(取消)收藏,请用

withAnimation
括起来。

© www.soinside.com 2019 - 2024. All rights reserved.