在Swift中,我经常必须将noop闭包传递给方法,以符合方法的预期参数(arity)。在Obj C的旧时代,人们可以通过nil
进行一次noop回调并完成它。在没有像下面那样传递空块的情况下,在Swift中有更快更优雅的方法吗?
UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: { (UIAlertAction) -> Void in }) // do nothing in callback
完整示例:
import UIKit
class UIAlertControllerFactory {
class func ok(title: String, message: String) -> UIAlertController {
var alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
var okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: { (UIAlertAction) -> Void in
})
alertController.addAction(okAction)
return alertController
}
}
答案 0 :(得分:39)
一般来说,如果您无法通过nil
:
var okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default,
handler:{ _ in })
在这种情况下你也可以传递nil
,因为(从iOS 9.0开始)处理程序是Optional
:
var okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default,
handler:nil)
答案 1 :(得分:6)
你可以定义一个 noop 作为一个什么都不做的默认闭包:(参考:https://realm.io/news/closures-api-design)
func noop() {}
func noop<T>(value: T) {}
func noop<T>() -> T? { return nil }
func noop<T, S>(value: T) -> S? { return nil }
使用:
var okAction = UIAlertAction(title: "Ok",
style: UIAlertActionStyle.Default,
handler: noop)
答案 2 :(得分:5)
根据Xcode文档,UIAlertAction
有convenience init
方法,声明如下:
convenience init(title: String, style: UIAlertActionStyle, handler: ((UIAlertAction!) -> Void)!)
如您所见,handler
参数是类型为((UIAlertAction!) -> Void)!
的隐式解包可选。所以你可以通过nil
。例如,您可以创建一个UIAlertController
个实例,其中包含UIAlertAction
handler: nil
个let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
alertController.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
presentViewController(alertController, animated: true, completion: nil)
:
handler
因此,您不需要为{{1}}创建一个空块。
答案 3 :(得分:3)
extension UIAlertAction {
convenience init(title: String, style: UIAlertActionStyle) {
return self.init(title: title, style: style, handler: { (UIAlertAction) -> Void in })
}
}
然后省略最后一个论点。你可以把它放到你的“工厂”里。