是否有可能使用增强的关键路径(如描述在这里与新#keyPath关键字)的CATransform3D财产斯威夫特3?
换句话说就是替换
let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
Run Code Online (Sandbox Code Playgroud)
喜欢的东西
let scaleAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.transform.???))
Run Code Online (Sandbox Code Playgroud) 使用《Swift 语言指南:扩展》中的示例代码我已经像这样扩展了 struct Double
extension Double {
func someFunc() {
print("someFunc")
}
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶这个声明
2.someFunc()
Run Code Online (Sandbox Code Playgroud)
没有生成编译时错误,例如:“Int”类型的值没有成员“someFunc”。我预计 2 的值会隐式转换为 Int,但 Swift 将其转换为 Double。这是为什么 ?Swift 如何确定本例中 2 的值是 Double 类型?
然后我尝试像这样调用 someFunc()
let x = 2
x.someFunc()
Run Code Online (Sandbox Code Playgroud)
这里我得到了预期的编译时错误
这是否与Swift 编程语言 3.0.1:语言指南:基础知识:类型安全和类型推断中的陈述相矛盾?
类型推断使编译器能够在编译代码时自动推断出特定表达式的类型,只需检查您提供的值即可。
编辑
从响应中我了解到发生这种情况是因为 Double 符合 ExpressibleByIntegerLiteral 协议。然而 Float 结构也确实符合它以及其他一些类型。下面我创建了也符合该协议的结构。然而最终在编译时选择了 Double。为什么?一个扩展的方法相对于其他扩展的方法的优先级是如何确定的?
struct someStruct: ExpressibleByIntegerLiteral{
var i:Int = 0
init(integerLiteral value: Int64){
i = Int(value)
}
}
extension someStruct {
func someFunc() {print("Somestruct someFunc") }
}
extension Double { …Run Code Online (Sandbox Code Playgroud)