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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:52:52