我还没有使用Swift那么多,但是来自Objective C,有一些关于Swift的东西是PITA让我的头脑。
在iOS编程中,我们有animateWithDuration:
方法,它是UIView的一部分。
所以我尝试使用Xcode的自动完成功能并开始输入:
UIView.animateWith
自动填充显示:
UIView.animateWithDuration(duration: NSTimeInterval, animations: () -> Void)
然后我选择了"持续时间"字段,然后键入数字:
UIView.animateWithDuration(0.5, animations: () -> Void)
然后我再次选中了动画块,然后按照目标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然后给我错误时:
无法调用“animateWithDuration”'使用类型的参数列表 '(FloatLiteralConvertible,动画:() - > Void)'
我不明白。这是Xcode为我生成的自动完成代码,为什么它会给我一个错误?
我注意到如果做一个简单的陈述,如:
UIView.animateWithDuration(0.5, animations: { () -> Void in
var num = 1 + 1;
})
它没有给我任何错误。
任何想法?
答案 0 :(得分:6)
来自"Calling Methods Through Optional Chaining":
任何通过可选链接设置属性的尝试都会返回a 类型
Void?
的值,使您可以与nil进行比较以查看 如果财产设置成功......
因此表达式的类型
self.customView?.transform = CGAffineTransformMakeTranslation(0.0, 0.0)
是Void?
(可选的Void)。如果闭包只包含单个表达式,
然后该表达式自动被视为返回值。
错误消息非常具有误导性,但它来自Void?
的事实
与Void
不同。
添加显式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返回类型的未注释单表达式闭包。