swift - 在 Swift 中将闭包存储为变量

标签 swift closures objective-c-blocks

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

相关文章:

swift - 如何将一个闭包附加到另一个闭包?

ios - swift:强制类型修饰符 "!"- 为什么它在 UIKit API 中使用(现在不合时宜)

ios - 使用传递给函数的闭包会导致 malloc 崩溃

ios - Swift:在 iOS 应用程序中读取和写入文件

groovy - 为什么 Groovy 闭包声明一个最大值,而不是常量数量的参数

ios - 从 block 中返回一个值

cocoa-touch - 弧: Getting EXC_BAD_ACCESS from inside block used in delegate method

iphone - iOS - 线程不会回到主线程

ios - 如何更改 UIScrollView 行为以在 > 0 处开始滚动?

json - 单击 Tableview 单元格不显示数据