我使用的Swift很少,但是来自Objective C,关于Swift的一些事情就是PITA。
在iOS编程中,我们有animateWithDuration:方法,它是UIView的一部分。
animateWithDuration:
因此,我尝试使用Xcode的自动完成功能并开始输入:
UIView.animateWith
自动完成显示:
UIView.animateWithDuration(duration: NSTimeInterval, animations: () -> Void)
然后,我进入“持续时间”字段,然后输入数字:
UIView.animateWithDuration(0.5, animations: () -> Void)
然后,我再次跳到动画块,然后按Enter键,就像我通常在Objective C中一样,Xcode现在显示:
UIView.animateWithDuration(0.5, animations: { () -> Void in code })
因此,我最后一次选择了用我的代码替换“代码”的选项卡:
UIView.animateWithDuration(0.5, animations: { () -> Void in self.customView?.transform = CGAffineTransformMakeTranslation(0.0, 0.0); })
那就是Xcode然后给我错误的时候:
无法使用类型为’(FloatLiteralConvertible,animations:()-> Void)’的参数列表调用’animateWithDuration’
我不明白 那就是Xcode为我生成的自动完成代码,为什么会给我一个错误?
我注意到是否做了一个简单的声明,例如:
UIView.animateWithDuration(0.5, animations: { () -> Void in var num = 1 + 1; })
它不会给我任何错误。
有任何想法吗?
从“通过可选链接进行调用的方法”中:
通过可选链接设置属性的任何尝试都会返回type的值Void?,这使您可以与nil进行比较以查看是否成功设置了属性…
Void?
因此表达式的类型
self.customView?.transform = CGAffineTransformMakeTranslation(0.0, 0.0)
是Void?(可选的Void)。如果闭包仅包含一个 表达式 ,则该表达式将自动作为 返回值 。该错误消息颇具误导性,但其来源与Void?有所不同Void。
Void
添加显式return语句可以解决此问题:
return
UIView.animateWithDuration(0.5, animations: { () -> Void in self.customView?.transform = CGAffineTransformMakeTranslation(0.0, 0.0) return })
更新:return使用Swift 1.2(Xcode 6.3)不再需要添加显式语句。从测试版发行说明中:
现在可以在Void上下文中使用带有非Void返回类型的带注释的单表达式闭包。