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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:55:09