如何快速关闭自我?
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()的作用!有人在乎解释吗?谢谢!
答案 0 :(得分:4)
这与人们遇到这些问题的问题相同:
What am I doing wrong in Swift for calling this Objective-C block/API call?
animateWithDuration:animations:completion: in Swift
以下是一般概念:
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)明确返回预期的内容。