问题描述
编译器抱怨
var completionHandler: (Float)->Void = {}
因为右侧不是适当签名的闭包,即采用float参数的闭包。以下将为完成处理程序分配“不做任何事情”关闭:
var completionHandler: (Float)->Void = {
(arg: Float) -> Void in
}
可以缩短为
var completionHandler: (Float)->Void = { arg in }
由于自动类型推断。
您可能想要的是将完成处理程序初始化为nil
与将Objective-C实例变量初始化为相同nil
。在Swift中,这可以通过可选的 实现:
var completionHandler: ((Float)->Void)?
现在,该属性会自动初始化为nil
(“无值”)。在Swift中,您将使用可选绑定来检查完成处理程序是否具有值
if let handler = completionHandler {
handler(result)
}
或可选的链接:
completionHandler?(result)
解决方法
在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中设置和使用的闭包?