当前位置: 首页 > 面试题库 >

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

谭光辉
2023-03-14
问题内容

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

因为右侧不是适当签名的闭包,即采用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)


 类似资料:
  • JavaScript 是一种非常面向函数的语言。它给了我们很大的自由度。在 JavaScript 中,我们可以随时创建函数,可以将函数作为参数传递给另一个函数,并在完全不同的代码位置进行调用。 我们已经知道函数可以访问其外部的变量。 但是,如果在函数被创建之后,外部变量发生了变化会怎样?函数会获得新值还是旧值? 如果将函数作为参数传递并在代码中的另一个位置调用它,该函数将访问的是新位置的外部变量吗

  • 问题内容: 将从大型文本文件提取的列表中返回最大的列表,但是如何将输出存储为变量? 问题答案: 使用命令替换: 另外,出于可移植性考虑,我建议始终将用作参数。我遇到了一些无法使用的化身。

  • 问题内容: 我想将生成的图像存储在变量中,以将其用作嵌入式图像。 这些功能都不适合我的用例: -将其写入标准输出。这确实有帮助..因为我必须将图像嵌入html文件中。 /从命令行执行时不执行任何操作 问题答案: 您尝试过还是等效的?

  • 我试图理解将jwt存储在本地存储(倾向于xss)与cookie(倾向于csrf)的安全含义。我想了解如果我将jwt令牌存储在前端的应用状态中的安全性影响,就像在redux商店中一样。 编辑: 我试图了解有关存储代币的更多信息。似乎所有的文章和答案实际上都是在确定有两种方法可以做到这一点后开始讨论的,即cookie或浏览器存储。像这样一个相关的问题:在浏览器中的何处存储JWT?如何防范CSRF?像这

  • 问题内容: 那么到达类变量的正确语法是什么? 问题答案: 在PHP中,方法和属性位于单独的命名空间中(您可以具有相同名称的方法和属性),而访问属性还是方法取决于您使用的语法。 是一个方法调用,因此PHP将在类的方法列表中进行搜索。 是属性提取,因此PHP将在类的属性列表中搜索。 被解析为方法调用,因此PHP会在您的类中搜索一个命名的方法,但是没有这样的方法(因此 Call to undefined

  • 问题内容: 我正在编写一个脚本来备份数据库。我有以下几行: 我想将stderr分配给一个变量,以便它将向自己发送一封电子邮件,让我知道如果出现问题,会发生什么。我已经找到了将stderr重定向到stdout的解决方案,但是由于stdout已经(通过gzip)发送到文件中,因此我无法做到这一点。如何将stderr分别存储在变量$ result中? 问题答案: 尝试将stderr重定向到stdout并