一尘不染

将闭包作为变量存储在Swift中

swift

在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中设置和使用的闭包?


阅读 310

收藏
2020-07-07

共1个答案

一尘不染

编译器抱怨

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)
2020-07-07