Swift 通过设置变量 B 自动将值设置为变量 A

Swift automatically set value to variable A by setting variable B

提问人:Bob 提问时间:9/24/2023 更新时间:9/24/2023 访问量:34

问:

我有一个问题,即当变量 B 更新时,是否可以自动将值设置为变量 A。 我设置了 2 个变量,如下所示:

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
}

我试图实现的是,每当变量atState获得一个值时:

anEntity.atState = .performAction(.walk)

anEntity.inAction 自动设置为:

anEntity.inAction = .walk

每当变量 atState 获得 .performAction 以外的值时,anEntity.inAction 会自动设置为:

anEntity.inAction = .none

这可以通过使用 Swift getter 和 setter 或任何其他方法来完成吗?如果是这样,请告诉我该怎么做。

先谢谢你。

Swift getter-setter

评论


答:

2赞 Alexander 9/24/2023 #1

您可能只想从当前状态派生当前操作,而不是保存两者并尝试使它们保持同步:

class Entity {
  var atState: CurrentState

  var inAction: CurrentAction {
    switch atState {
    case .performAction(let action): return action
    default: return .none
    }
  }
}

另一个想法是将这个责任转移到本身,这样你就可以在代码中轻松地将任何状态的动作转移到你可能需要它的地方:CurrentState

extension CurrentState {
  var inAction: CurrentAction {
    switch self {
    case .performAction(let action): return action
    default: return .none
    }
  }
}

class Entity {
  var atState: CurrentState
  // No need to store the action directly anymore
}

所以现在你可以用例如.entity.atState.action

评论

0赞 Bob 9/24/2023
这太棒了!非常感谢!
0赞 Alexander 9/24/2023
@Bob 您甚至可以将语句移动到 's 上的计算属性中,以便可以调用 .switchCurrentStateentity.state.action
0赞 Bob 9/24/2023
你能告诉我如何做到这一点吗,因为并非所有状态都有附加的操作(即空闲、未启动)。谢谢。
0赞 Alexander 9/24/2023
这些都属于这种情况,对吧?default: return .none
0赞 Bob 9/24/2023
对不起,我不熟悉计算属性。你能给我看一下设置变量atState的代码,这样我就可以像你说的那样做entity.atState.action。