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<Client>
类型,但过滤器返回一个数组。因此,错误消息准确地告诉您问题所在。您正在尝试将 [Client]
作为 FetchedResults<Client>
返回,因此您的类型不匹配。
您有两种解决方案:
-
您可以过滤 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 警告的解决