常量被推断为类型'()',这可能是意外的-在Swift中替换dispatch_once

时间:2018-10-03 06:35:04

标签: objective-c swift grand-central-dispatch

我的主要问题围绕dispatch_once。我正在 Swift 中转换此 objective-c 代码:

dispatch_once(&_startupPred, ^{
        [MPPush executeUnsafeStartupWithConfig:[MPConfig configWithAppKey:appKey withAppId:appID withAccountId:accountId forProduction:inProduction] authToken:authToken];
    });  

Swiftify并没有太大帮助。所以我深入一点。显然dispatch_once在Swift中不再存在。根据{{​​3}}接受的答案,我可以通过以下方式实现:

let executeStartup = {
            self.executeUnsafeStartupWithConfig(config: MPConfig.config.configWithAppKey(appKey: appKey, withAppId: appId, withAccountId: accountId, forProduction: inProduction), authToken: authToken)
        }()

_ = executeStartup  

但是这样做,我得到此警告:

  

常量“ executeStartup”推断为类型为“()”,可能是   意外

那么首先,这是在Swift中替换dispatch_once的正确方法吗?其次,我该如何处理此警告?

2 个答案:

答案 0 :(得分:1)

是的,这是您可以替换dispatch_once的方法之一。对于您的特定用例,您可以考虑将此代码放置在应用程序的生命周期中仅执行一次的位置,这可能是您用例的最佳方法。

如果您只是想摆脱警告,可以将executeStartup的类型声明为Any

let executeStartup : Any = {
        self.executeUnsafeStartupWithConfig(config: MPConfig.config.configWithAppKey(appKey: appKey, withAppId: appId, withAccountId: accountId, forProduction: inProduction), authToken: authToken)
    }()

答案 1 :(得分:1)

这肯定会执行一次该块,并且您可以将类型指定为Void,以便compiler不会抱怨。

let executeStartup: Void = {
    self.executeUnsafeStartupWithConfig(config: MPConfig.config.configWithAppKey(appKey: appKey, withAppId: appId, withAccountId: accountId, forProduction: inProduction), authToken: authToken)
 }()

您也可以使用lazy var executeStartup: Void,因为这也可以确保该块执行一次。