在Swift中将闭包存储为变量
发布时间:2020-12-14 06:12:05 所属栏目:百科 来源:网络整理
导读:在Objective-C中,您可以定义块的输入和输出,存储传递到方法的那些块中的一个,然后使用该块: // in .h typedef void (^APLCalibrationProgressHandler)(float percentComplete); typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPowe
在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 = {} 因为右手侧不是适当签名的关闭,即闭合 var completionHandler: (Float)->Void = { (arg: Float) -> Void in } 这可以缩短到 var completionHandler: (Float)->Void = { arg in } 由于自动类型推理。 但你可能想要的是完成处理程序被初始化为nil var completionHandler: ((Float)->Void)? 现在该属性自动初始化为nil(“无值”)。 if let handler = completionHandler { handler(result) } 或可选链接: completionHandler?(result) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |