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

Posted

技术标签:

【中文标题】iOS Xcode Swift 自动完成功能坏了?【英文标题】:iOS Xcode Swift autocomplete broken? 【发布时间】:2014-11-27 14:05:25 【问题描述】:

我使用 Swift 的次数不多,但我来自 Objective C,关于 Swift 的一些事情是让我印象深刻的 PITA。

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

所以我尝试使用 Xcode 的自动完成功能并开始输入:

UIView.animateWith

自动完成显示:

UIView.animateWithDuration(duration: NSTimeInterval, animations: () -> Void)

然后我跳到“持续时间”字段,然后输入一个数字:

UIView.animateWithDuration(0.5, animations: () -> Void)

然后我再次切换到动画块,并像我通常在 Objective C 中那样按 Enter 键,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;
)

它没有给我任何错误。

有什么想法吗?

【问题讨论】:

【参考方案1】:

来自"Calling Methods Through Optional Chaining":

任何通过可选链接设置属性的尝试都会返回一个 Void? 类型的值,它使您可以与 nil 进行比较以查看 如果属性设置成功...

因此表达式的类型

self.customView?.transform = CGAffineTransformMakeTranslation(0.0, 0.0)

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)。来自 Beta 版本说明:

具有非 Void 返回类型的未注释单表达式闭包现在可以在 Void 上下文中使用。

【讨论】:

以上是关于iOS Xcode Swift 自动完成功能坏了?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swift 将 google 地方自动完成功能添加到 xcode(教程)

Xcode 自动完成功能在 Swift 游乐场的 Sources 文件夹中不起作用

Swift - Xcode 8.3 自动完成未显示

Xcode 6.1 if/else/for/switch 语句不自动完成(仅限 Swift)

如何让链接在 iOS 中使用 Xcode/Swift 自动打开 safari 应用程序(不是本地)?

我的班级的 Xcode 6.4 自动完成功能不起作用?