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

Swift中如何通过更新atState自动同步设置inAction的值?

Swift中自动关联atState与inAction的实现方案

当然可以实现,有两种常用方案,你可以根据实际需求选择:

方案一:使用属性观察器didSet

给atState添加didSet观察器,每次atState被赋值后自动同步inAction的值。这种方案下inAction是存储属性,适合需要保留状态或允许后续手动修改的场景:

enum CurrentState: Hashable {
    case uninitiated
    case idle
    case performAction(CurrentAction)
}

enum CurrentAction: Int {
    case eat
    case drink
    case walk
    case run
    case none
}

class Entity {
    var atState: CurrentState {
        didSet {
            switch atState {
            case .performAction(let action):
                inAction = action
            default:
                inAction = .none
            }
        }
    }
    var inAction: CurrentAction
    
    // 初始化时同步初始状态
    init(atState: CurrentState = .uninitiated) {
        self.atState = atState
        switch atState {
        case .performAction(let action):
            self.inAction = action
        default:
            self.inAction = .none
        }
    }
}

使用示例:

let entity = Entity()
print(entity.inAction) // 输出: none

entity.atState = .performAction(.walk)
print(entity.inAction) // 输出: walk

entity.atState = .idle
print(entity.inAction) // 输出: none

方案二:将inAction设为计算属性

如果inAction完全由atState决定,不需要手动修改,直接把inAction定义为计算属性更简洁,还能避免两者状态不一致的问题:

enum CurrentState: Hashable {
    case uninitiated
    case idle
    case performAction(CurrentAction)
}

enum CurrentAction: Int {
    case eat
    case drink
    case walk
    case run
    case none
}

class Entity {
    var atState: CurrentState
    var inAction: CurrentAction {
        switch atState {
        case .performAction(let action):
            return action
        default:
            return .none
        }
    }
    
    init(atState: CurrentState = .uninitiated) {
        self.atState = atState
    }
}

使用示例:

let entity = Entity(atState: .performAction(.drink))
print(entity.inAction) // 输出: drink

entity.atState = .uninitiated
print(entity.inAction) // 输出: none

方案选择

  • 若需要允许后续手动修改inAction(比如特殊场景下临时覆盖),选方案一;
  • 若inAction始终由atState决定,不需要手动干预,方案二更可靠,减少维护成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:03:23