Swift 捕获手势识别器开始状态的惯用方法

Swift idiomatic method to capture gesture recognizer begin state

iOS 手势识别器会经历不同的状态。在第一个开始状态捕获参考状态是很常见的(至少对我而言)。在 ObjectiveC 中,这可能类似于:

- (void)pan:(UIPanGestureRecognizer *)pan {
    static NSTimeInterval originalBegin;
    static NSTimeInterval originalEnd;
    static CGFloat originalYOffset;
    if (pan.state == UIGestureRecognizerStateBegan) {
        originalBegin = self.timeAxis.begin;
        originalEnd = self.timeAxis.end;
        originalYOffset = self.yOffset;
    }
    ...
}

但是 Swift 没有在函数执行之间保留值的静态函数变量。我可以在 class 级别将这些类型的变量转换为 vars,但随后它会污染对象的变量 space,仅适用于刚刚附加到特定识别器的变量。

是否有 Swift 惯用的方式在本地捕获此模式?或者这是 Swift 与 UIKit 有摩擦的领域之一。

在 Swift 中,您可以在函数中嵌套结构、class 或枚举定义,并在 运行 运行 中保持静态。例如:

func run() {
    enum State { static var counter = 0 }
    State.counter += 1
    print(State.counter)
}

run()
run()
run()