如何为SwiftData的Task类添加earnedTime计算属性用于任务筛选?
解决方案
1. 修改Task模型,添加自动计算的earnedTime属性
直接给Task类加一个计算属性,不用手动存储,每次相关字段变化时自动更新最终时长:
import Foundation import SwiftData @Model class Task { var name: String var startTime: Date var endTime: Date var timeAdjustment: TimeAdjustment var customTimeAdjustment: TimeInterval // Custom time adjustment var customAdjustmentName: String // 新增:自动计算最终有效时长 var earnedTime: TimeInterval { let baseDuration = endTime.timeIntervalSince(startTime) let totalAdjustment = timeAdjustment.adjustment + customTimeAdjustment return baseDuration + totalAdjustment } init(name: String = "", startTime: Date = .now, endTime: Date = .now, timeAdjustment: TimeAdjustment = .none, customTimeAdjustment: TimeInterval = 0, customAdjustmentName: String = "") { self.name = name self.startTime = startTime self.endTime = endTime self.timeAdjustment = timeAdjustment self.customTimeAdjustment = customTimeAdjustment self.customAdjustmentName = customAdjustmentName } } enum TimeAdjustment: String, CaseIterable, Codable { case none = "None" case kidsWereThere = "Kids were there -30 minutes" case attentionDiverted = "Attention was diverted -15 minutes" case fellAsleep = "We fell asleep -15 minutes" case purelyKink = "It was purely kink -15 minutes" case custom = "Custom Entry" var adjustment: TimeInterval { switch self { case .none: return 0 case .kidsWereThere: return -30 * 60 case .attentionDiverted: return -15 * 60 case .fellAsleep: return -15 * 60 case .purelyKink: return -15 * 60 case .custom: return 0 // Custom adjustment will be set separately } } }
2. 更新Picker,添加按earnedTime排序的选项
在原有Picker选项里,加上按时长排序的两个选项:
Picker("Sort", selection: $sortOrder) { Text("Newest") .tag(SortDescriptor(\Task.startTime, order: .reverse)) Text("Oldest") .tag(SortDescriptor(\Task.endTime, order: .forward)) Text("Name") .tag(SortDescriptor(\Task.name, order: .forward)) // 新增:按时长排序的选项 Text("时长(从短到长)") .tag(SortDescriptor(\Task.earnedTime, order: .forward)) Text("时长(从长到短)") .tag(SortDescriptor(\Task.earnedTime, order: .reverse)) } .pickerStyle(.inline)
为什么用计算属性?
- 不用手动在用户输入任务信息时触发计算,只要
startTime、endTime、timeAdjustment或customTimeAdjustment任一值变化,earnedTime会自动更新 - SwiftData支持基于计算属性创建
SortDescriptor,因为它依赖的都是模型内的存储属性,能正常参与排序逻辑
内容的提问来源于stack exchange,提问作者TJ Jaglinski
相关产品推荐
相关产品推荐

