在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 }

由于自动类型推断.

But您可能希望完成处理程序被初始化为nil

var completionHandler: ((Float)->Void)?

现在属性自动初始化为nil("无值").

if let handler = completionHandler {
    handler(result)
}

或可选链接:

completionHandler?(result)

Swift相关问答推荐

如何返回JSON数据?

传递给SWIFT ResultBuilder的闭包中结果类型的对象

在SwiftUI中判断选项时避免重复查看

是否可以限制 ExpressibleByIntegerLiteral struct 的初始值?

当将新值推送到 NavigationStack 时,SwiftUI 的 navigationDestination 已在堆栈的早期声明

Swift iOS:确定贝塞尔曲线路径是否与 UIView 框架相交?

Swift 并发任务与调度队列线程:是什么决定同时运行多少任务?

快速更改tableView中的数据

XCUITest 在 TearDown 期间随机失败-无法终止 com.bundle.id

有什么方法可以快速为泛型参数分配默认值?

如何在填充上添加 if else 语句? SwiftUI

不使用 ViewController 时如何显示推送通知的alert 对话框

在 Select 器上显示alert Select SwiftUI

调用从 SwiftUI 视图传递到 PageViewController.Coordinator 的函数

如何自己快速编写 Hashable 协议

在 Swift 中返回实例类型

Swift 协议只能设置?

如何在 GCD 中停止 DispatchWorkItem?

如何在 Swift 中使用 Crashlytics 登录?

如何交换快速数组中的元素?