小编Rad*_*dek的帖子

使用#keyPath CATransform3D密钥路径

是否有可能使用增强的关键路径(如描述在这里与新#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)

transform scale cabasicanimation catransform3d swift3

6
推荐指数
1
解决办法
907
查看次数

Swift 中的隐式类型转换

使用《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)

types casting implicit swift swift3

5
推荐指数
1
解决办法
959
查看次数