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
相关产品推荐
相关产品推荐

