在Swift中存储一个闭包作为variables

在Objective-C中,您可以定义一个块的input和输出,将其中一个块传入方法中,然后再使用该块:

// in .h typedef void (^APLCalibrationProgressHandler)(float percentComplete); typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPower, NSError *error); // in .m @property (strong) APLCalibrationProgressHandler progressHandler; @property (strong) APLCalibrationCompletionHandler completionHandler; - (id)initWithRegion:(CLBeaconRegion *)region completionHandler:(APLCalibrationCompletionHandler)handler { self = [super init]; if(self) { ... _completionHandler = [handler copy]; .. } return self; } - (void)performCalibrationWithProgressHandler:(APLCalibrationProgressHandler)handler { ... self.progressHandler = [handler copy]; ... dispatch_async(dispatch_get_main_queue(), ^{ _completionHandler(0, error); }); ... } 

所以我试图在Swift中做平等:

 var completionHandler:(Float)->Void={} init() { locationManager = CLLocationManager() region = CLBeaconRegion() timer = NSTimer() } convenience init(region: CLBeaconRegion, handler:((Float)->Void)) { self.init() locationManager.delegate = self self.region = region completionHandler = handler rangedBeacons = NSMutableArray() } 

编译器不喜欢completionHandler的声明。 不是我责怪它,但是,我如何定义一个可以在Swift中设置和使用的闭包?

编译器抱怨

 var completionHandler: (Float)->Void = {} 

因为右边不是适当的签名的封闭,即一个浮动参数的封闭。 以下将为完成处理程序分配一个“什么都不做”闭包:

 var completionHandler: (Float)->Void = { (arg: Float) -> Void in } 

这可以缩短到

 var completionHandler: (Float)->Void = { arg in } 

由于自动types推断。

但是你可能想要的是,完成处理程序被初始化nil ,就像Objective-C实例variables被初始化nil 。 在Swift中,可以通过一个可选项来实现:

 var completionHandler: ((Float)->Void)? 

现在属性自动初始化nil (“无值”)。 在Swift中,你将使用可选的绑定来检查完成处理程序是否有值

 if let handler = completionHandler { handler(result) } 

或可选的链接:

 completionHandler?(result) 

Objective-C的

 @interface PopupView : UIView @property (nonatomic, copy) void (^onHideComplete)(); @end @interface PopupView () ... - (IBAction)hideButtonDidTouch:(id sender) { // Do something ... // Callback if (onHideComplete) onHideComplete (); } @end PopupView * popupView = [[PopupView alloc] init] popupView.onHideComplete = ^() { ... } 

迅速

 class PopupView: UIView { var onHideComplete: (() -> Void)? @IBAction func hideButtonDidTouch(sender: AnyObject) { // Do something .... // Callback if let callback = self.onHideComplete { callback () } } } var popupView = PopupView () popupView.onHideComplete = { () -> Void in ... } 

我提供了一个例子,不知道这是否是你之后。

 var completionHandler: (value: Float) -> (); func printFloat(value: Float) { println(value) } completionHandler = printFloat completionHandler(value: 5) 

它只是使用声明的completionHandlervariables来打印5。

这也起作用:

 var exeBlk = { () -> Void in } exeBlk = { //do something } //instead of nil: exeBlk = {} 

可以将闭包声明为下面的typealias

 typealias Completion = (Bool,Any,Error)->Void 

如果你想在代码中的任何地方使用你的function, 你可以像普通variables一样写

 func xyz(with param1:String,completion:Completion) { } typealias Completion = (Bool,Any,Error)->Void 

在swift 4.我创build了一个包含两个参数字典和布尔的闭包variables。

 var completionHandler:([String:Any], Bool)->Void = { dict, success in if sucess { print(dict) } } 

调用闭包variables

 self.completionHandler(["name":"Gurjinder singh"],true) 

对我而言,以下是工作:

 var completionHandler:((Float)->Void)!