一尘不染

iOS Xcode Swift自动完成功能坏了吗?

swift

我使用的Swift很少,但是来自Objective C,关于Swift的一些事情就是PITA。

在iOS编程中,我们有animateWithDuration:方法,它是UIView的一部分。

因此,我尝试使用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;
})

它不会给我任何错误。

有任何想法吗?


阅读 260

收藏
2020-07-07

共1个答案

一尘不染

“通过可选链接进行调用的方法”中

通过可选链接设置属性的任何尝试都会返回type的值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返回类型的带注释的单表达式闭包。

2020-07-07