在dispatch_async中正确引用self

时间:2014-06-22 01:03:30

标签: ios closures swift

如何快速关闭自我?

dispatch_async(dispatch_get_main_queue()) {
    self.popViewControllerAnimated(true)
}

我收到错误:

Cannot convert the expression's type 'Void' to type 'UIViewController!"

随机我试过:

dispatch_async(dispatch_get_main_queue()) { ()
    self.popViewControllerAnimated(true)
}

它有效。不确定extra()的作用!有人在乎解释吗?谢谢!

2 个答案:

答案 0 :(得分:4)

这与人们遇到这些问题的问题相同:

What am I doing wrong in Swift for calling this Objective-C block/API call?

animateWithDuration:animations:completion: in Swift

以下是一般概念:

来自Swift书:https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Closures.html

Closures的优化之一是:

  

单表达式闭包的隐式返回

因此,如果闭包中只有一行,则闭包的返回值会发生变化。在这种情况下,popViewController返回正在弹出的视图控制器。通过向闭包添加(),您只需将其设为2行闭包,并且返回值不再隐含!

答案 1 :(得分:0)

我几天前回答了类似问题的相关问题:Swift的单表达式封闭的隐含返回值':animateWithDuration:animations:completion: in Swift

在这种情况下,方法popViewControllerAnimated返回从堆栈弹出的UIViewController:(https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instm/UINavigationController/popViewControllerAnimated:)

即使你没有使用该方法的返回值显式地做任何事情,Swift也使用该值(返回的UIViewController)作为闭包的返回值 - 但是,闭包期望返回值为空隙。

当你添加额外的parens ()时,你基本上在闭包中增加了另一行,因为它不再是一个单表达式的闭包'它不再隐式返回弹出的UIViewController。

社区最终将会达成一项处理此问题的惯例,因为现在当我遇到它时,我一直主张在关闭结束时添加return ()(因为它明确说明了意图,(1) )通过添加另一个语句来短路“隐式返回”,以及(2)明确返回预期的内容。