在Swift中传递空闭包的优雅方式

时间:2014-10-04 15:13:44

标签: ios swift cocoa-touch

在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
    }
}

4 个答案:

答案 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文档,UIAlertActionconvenience init方法,声明如下:

convenience init(title: String, style: UIAlertActionStyle, handler: ((UIAlertAction!) -> Void)!) 

如您所见,handler参数是类型为((UIAlertAction!) -> Void)!隐式解包可选。所以你可以通过nil。例如,您可以创建一个UIAlertController个实例,其中包含UIAlertAction handler: nillet 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 })
    }
}

然后省略最后一个论点。你可以把它放到你的“工厂”里。