在Objective-C中,您可以定义块的输入和输出,存储传递给方法的那些块之一,然后在以后使用该块:
// 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 = {}
因为右侧不是适当签名的闭包,即采用float参数的闭包。以下将为完成处理程序分配“不做任何事情”关闭:
var completionHandler: (Float)->Void = { (arg: Float) -> Void in }
可以缩短为
var completionHandler: (Float)->Void = { arg in }
由于自动类型推断。
但是 您可能想要的是将完成处理程序初始化为nil 与将Objective-C实例变量初始化为相同nil。在Swift中,这可以通过 可选的 实现:
nil
var completionHandler: ((Float)->Void)?
现在,该属性会自动初始化为nil(“无值”)。在Swift中,您将使用可选绑定来检查完成处理程序是否具有值
if let handler = completionHandler { handler(result) }
或可选的链接:
completionHandler?(result)