在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)
它只是使用声明的completionHandler
variables来打印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)!