SwiftUI,Xcode 13,关于 .filter'ing CoreData 的问题

Posted

技术标签:

【中文标题】SwiftUI,Xcode 13,关于 .filter\'ing CoreData 的问题【英文标题】:SwiftUI, Xcode 13, Question about .filter'ing CoreDataSwiftUI,Xcode 13,关于 .filter'ing CoreData 的问题 【发布时间】:2021-08-13 16:34:38 【问题描述】:
@FetchRequest(
        entity: Client.entity(),
        sortDescriptors: [])
    private var clients: FetchedResults<Client>

(...)

var searchResults: FetchedResults<Client> 
            if searchText.isEmpty 
                return clients
             else 
                return clients.filter($0.name!.contains(searchText)) // Error here!
            
        

(...)

ForEach(searchResults, id: \.self)  client in

(...)

错误

Cannot convert return expression of type '[FetchedResults<Client>.Element]' (aka 'Array<Client>') to return type 'FetchedResults<Client>'

嗨,

我不确定我的逻辑是怎么错的。有人可以告诉我如何修复 searchResults 吗?

另外,这是过滤结果的更有效方式还是应该在 ForEach() 中过滤?当我将过滤器放入 ForEach() 时似乎很慢

【问题讨论】:

可能是return Array(clients.filter ...)?但是您可能希望在 fetch 请求中而不是之后应用过滤器。想象一下,你有 500k 个元素,你检索 500k 然后过滤得到 100 个,但你可以过滤请求,只得到 100 个。 感谢您的回复。我按照你的建议做了:我正在获取过滤后的数据,而不是过滤获取的数据。 【参考方案1】:

虽然我知道你有一个代码修复,而且它是正确的,但我想为后人回答这个问题,因为我自己也遇到了这个问题。逻辑错误仅仅是因为您的searchResults var 是FetchedResults&lt;Client&gt; 类型,但过滤器返回一个数组。因此,错误消息准确地告诉您问题所在。您正在尝试将 [Client] 作为 FetchedResults&lt;Client&gt; 返回,因此您的类型不匹配。

您有两种解决方案:

    您可以过滤 fetch 请求,这就是您根据 @Larme 的建议解决它的方法。如果您只需要 UI 中的过滤结果和/或您有很多结果,这将特别有用。 您可以在使用获取的结果时进行过滤。当您希望您的用户能够确定通过他们自己的选择过滤掉的内容时,这很有用,但您不知道他们会提前进行哪些过滤,或者无论您正在执行何种过滤,您可能需要稍后整个 FetchRequest。

【讨论】:

感谢您的回复

以上是关于SwiftUI,Xcode 13,关于 .filter'ing CoreData 的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XCode 中生成 iOS 13 SwiftUI 项目?

在 SwiftUI 中实现 Firebase 身份验证时,Xcode 13 找不到 FacebookAppID [重复]

最新Xcode 13.3RC对SwiftUI和CoreData中两个恼人问题的修复

最新Xcode 13.3RC对SwiftUI和CoreData中两个恼人问题的修复

更新到 Xcode 13,尝试在 iOS 但不是 macOS 上运行 SwiftUI 应用程序时获得唯一的错误代码

Xcode 13.2.1生成SwiftUI+CoreData项目运行时提示:persistent container with no stores loaded 警告的解决