You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftData的@Query中指定不区分大小写的自定义排序?

SwiftData实现不区分大小写的字符串排序

要让SwiftData对String类型字段实现不区分大小写的排序,你可以通过自定义SortDescriptor指定不区分大小写的比较规则,无需在内存中二次排序(数据库层面排序更高效)。

方案1:使用不区分大小写的比较器

直接在@Query的sort参数中传入带指定比较器的SortDescriptor:

struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    @Query(sort: [SortDescriptor(\.name, comparator: .caseInsensitive)]) 
    private var items: [Item]
    
    // 视图剩余代码...
}

.caseInsensitive基于Unicode标准实现不区分大小写的比较,能让["a", "B", "C"]排序为["a", "B", "C"](符合不区分大小写的字母顺序)。

方案2:本地化标准排序(推荐)

如果你的应用需要适配多语言环境,推荐使用.localizedStandard比较器,它会遵循系统本地化规则(自动忽略大小写、重音符号等),更符合用户的使用习惯:

struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    @Query(sort: [SortDescriptor(\.name, comparator: .localizedStandard)]) 
    private var items: [Item]
    
    // 视图剩余代码...
}

为什么不推荐内存排序?

如果尝试在获取数据后通过sorted()方法在内存中排序(如下),当数据量较大时会占用更多内存且效率更低,而上述方案是在数据库层面完成排序,性能更优:

// 不推荐(仅作示例)
private var sortedItems: [Item] {
    items.sorted { $0.name.localizedStandardCompare($1.name) == .orderedAscending }
}

内容的提问来源于stack exchange,提问作者Syd Polk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:23:32