如何判断SwiftUI KeyPathComparator是升序还是降序?
SwiftUI Table:判断排序顺序并保存到UserDefaults
问题描述
已经按照Apple开发者文档实现了SwiftUI Table的可排序功能,用@Published var sortOrder: [KeyPathComparator<Song>]存储排序状态,但无法判断当前是升序还是降序,导致没法把正确的排序规则保存到UserDefaults里。想要实现类似示例中的判断逻辑,完成排序规则的持久化。
解决方案
KeyPathComparator本身提供了两个关键属性来获取排序信息:
keyPath: 对应你用来排序的模型属性路径(比如\Song.titleValue)order: 是SortOrder枚举类型,.forward代表升序,.reverse代表降序
不需要直接比较整个KeyPathComparator实例,分别检查这两个属性即可完成判断。以下是具体实现代码:
保存排序规则到UserDefaults
@Published var sortOrder: [KeyPathComparator<Song>] = [] // ... Button("Save Sort Order") { guard let currentSort = sortOrder.first else { return } switch currentSort.keyPath { case \Song.titleValue: let sortDirection = currentSort.order == .forward ? "Increasing" : "Decreasing" UserDefaults.standard.set("Title-\(sortDirection)", forKey: "SavedSortOrder") case \Song.duration: // 示例:添加其他可排序字段的判断 let sortDirection = currentSort.order == .forward ? "Increasing" : "Decreasing" UserDefaults.standard.set("Duration-\(sortDirection)", forKey: "SavedSortOrder") // 可扩展更多字段的判断逻辑 default: break } }
从UserDefaults恢复排序规则
如果需要在App启动时恢复之前保存的排序状态,可以补充以下代码:
// 在初始化或viewAppear等时机执行恢复逻辑 if let savedSortKey = UserDefaults.standard.string(forKey: "SavedSortOrder") { switch savedSortKey { case "Title-Increasing": sortOrder = [KeyPathComparator(\Song.titleValue, order: .forward)] case "Title-Decreasing": sortOrder = [KeyPathComparator(\Song.titleValue, order: .reverse)] case "Duration-Increasing": sortOrder = [KeyPathComparator(\Song.duration, order: .forward)] case "Duration-Decreasing": sortOrder = [KeyPathComparator(\Song.duration, order: .reverse)] default: // 设置默认排序规则 sortOrder = [KeyPathComparator(\Song.titleValue, order: .forward)] } }
说明
- 通过
currentSort.keyPath匹配具体排序字段,避免直接比较整个KeyPathComparator实例带来的不确定性 - 用
SortOrder.forward和SortOrder.reverse明确区分升序/降序,逻辑清晰且符合SwiftUI的API设计
内容的提问来源于stack exchange,提问作者Yiming Designer
相关产品推荐
相关产品推荐

