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 级别将这些类型的变量转换为 var
s,但随后它会污染对象的变量 space,仅适用于刚刚附加到特定识别器的变量。
是否有 Swift 惯用的方式在本地捕获此模式?或者这是 Swift 与 UIKit 有摩擦的领域之一。
在 Swift 中,您可以在函数中嵌套结构、class 或枚举定义,并在 运行 运行 中保持静态。例如:
func run() {
enum State { static var counter = 0 }
State.counter += 1
print(State.counter)
}
run()
run()
run()
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 级别将这些类型的变量转换为 var
s,但随后它会污染对象的变量 space,仅适用于刚刚附加到特定识别器的变量。
是否有 Swift 惯用的方式在本地捕获此模式?或者这是 Swift 与 UIKit 有摩擦的领域之一。
在 Swift 中,您可以在函数中嵌套结构、class 或枚举定义,并在 运行 运行 中保持静态。例如:
func run() {
enum State { static var counter = 0 }
State.counter += 1
print(State.counter)
}
run()
run()
run()