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

Ios 为什么核心动画类型采用字符串关键点路径?,ios,swift,core-animation,Ios,Swift,Core Animation,当在CALayer上设置特定属性的动画时,我不明白为什么keyPath是一个字符串。仅仅使用枚举不是更好更安全吗?只是想知道键入字符串文字的好处 示例:let flash=CASpringAnimation(keyPath:“borderColor”)是用Objective C编写的,如果您想在swift Codable和CodingKeys中使用反射,则Objective C没有swift枚举 核心动画还用于检测层特性的更改并设置其动画。这就是允许隐式动画的原因,也是为什么UIView.ani

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

示例:
let flash=CASpringAnimation(keyPath:“borderColor”)
是用Objective C编写的,如果您想在swift Codable和CodingKeys中使用反射,则Objective C没有swift枚举


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

尽管Josh Homann的回答非常有用,但值得注意的是,在这种情况下没有特定的枚举可以工作<代码>CASpringAnimation可以应用于任何属性,而不仅仅是内置属性。即使是“内置”也是有误导性的,因为有许多内置CALayer子类,它们本身具有不同的属性。动画甚至不必应用于层(SceneKit也使用它们)。如果将自定义特性添加到层中,并希望使用spring动画对其进行动画制作,则如果这是枚举,则不可能实现

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

let flash = CASpringAnimation(keyPath: #keyPath(CALayer.borderColor))
这提供了编译时检查,以确定该方法是否已定义。这在很大程度上实现了使用enum所期望的目标,同时还具有足够的灵活性来处理任何目标和属性

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

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

非常简洁的回答,可以清楚地解释它。谢谢你回答得很好。你能提供一些关于核心动画的好资源吗?谢谢你的进一步解释,Rob。非“内置”类型的示例是什么?一个视图上不是有有限数量的属性可以设置动画吗?非内置的,我的意思是“自定义CALayer子类”。我一直在制作这些属性。可以设置动画的层上有无数个特性(当然,它们可以是关键路径,而不仅仅是简单的特性)。有关示例,请参见。该层有一个名为
touchPointForIdentifier
的字典。我为keyPath
touchPointForIdentifier..scale设置动画(NSDictionary将其所有关键点显示为关键路径)。“缩放”是简单NSObject子类(不是层)上的一个属性。有关更简单的示例,请参见这是一个圆形层,它为其
半径
属性设置动画。(它隐式地设置其半径属性的动画,因此如果调用
circle.radius=4
,它将设置该属性的动画,但它是通过关键路径“radius”上的CABasicAnimation实现的。)