在 Objective-C 中,您可以定义 block 的输入和输出,存储传递给方法的其中一个 block ,然后稍后使用该 block :
// 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
这可以通过可选的来实现:
var completionHandler: ((Float)->Void)?
现在该属性自动初始化为 nil
(“无值”)。
在 Swift 中,你可以使用可选绑定(bind)来检查
完成处理程序有一个值
if let handler = completionHandler {
handler(result)
}
或可选链:
completionHandler?(result)
关于swift - 在 Swift 中将闭包存储为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24603559/