为什么核心动画类型采用字符串键路径?

Why Do Core Animation Types Take A String Key Path?

我很困惑为什么在 CALayer 上为特定 属性 设置动画时 keyPath 是一个字符串。使用枚举不是更好更安全吗?只是想知道输入字符串文字的好处。

示例:let flash = CASpringAnimation(keyPath: "borderColor")

Core Animation 是在 Objective C 中编写的,如果您正在考虑像 Swift Codable 和 CodingKeys 中那样使用反射,则 Objective C 没有 swift 枚举.

Core Animation 还使用 KVO 来检测图层属性的变化并制作动画。这就是允许隐式动画的原因,也是为什么 UIView.Animation 方法能够在您在其块内进行更改时为您的视图设置动画,而无需显式设置任何动画。您更改 属性 的值,动画系统会通过 KVO 观察到该更改并为您生成相应的动画。

虽然 Josh Homann 的回答非常有帮助,但同样值得注意的是,在这种情况下没有可以工作的特定枚举。 CASpringAnimation 可以应用于任何 属性,而不仅仅是内置的。甚至 "built-in" 也具有误导性,因为有许多内置的 CALayer 子类,它们本身具有不同的属性。动画甚至不必应用于层(SceneKit 也使用它们)。如果您将自定义 属性 添加到图层,并希望使用 spring 动画对其进行动画处理,那么如果这是一个枚举是不可能的。

也就是说,您可以比在此处传递字符串(甚至是字符串常量)做得更好。您可以使用 #keyPath:

let flash = CASpringAnimation(keyPath: #keyPath(CALayer.borderColor))

这提供了编译时检查是否确实定义了此方法。这实现了您使用枚举寻找的大部分目标,同时足够灵活以处理任何目标和 属性.

将来,希望 Core Animation 能够接受新的 Swift 4 "KeyPath" 类型,您将能够做到这一点:

let flash = CASpringAnimation(keyPath: \CALayer.borderColor)