Предполагается, что константа имеет тип '()', что может быть неожиданно - замена dispatch_once в Swift - PullRequest
0 голосов
/ 03 октября 2018

Моя главная проблема вращается вокруг dispatch_once.Я конвертирую этот target-c код в Swift :

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

Swiftify не очень помогает.Так что я копаю немного глубже.Видимо dispatch_once больше не в Swift.В соответствии с этим принятым ответом, я могу добиться этого следующим образом:

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

_ = executeStartup  

Но при этом я получаю это предупреждение:

Константа executeStartup предполагает, что имеет тип '()', что может быть неожиданным

Итак, во-первых, это правильный способ замены dispatch_once в Swift?Во-вторых, как мне справиться с этим предупреждением?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Это определенно выполнит блок один раз, и вы можете указать тип как 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, поскольку это также обеспечитблок выполняется один раз.

0 голосов
/ 03 октября 2018

Да, это один из способов заменить dispatch_once.Для вашего конкретного варианта использования вы можете рассмотреть возможность размещения этого кода там, где он будет выполняться только один раз в жизненном цикле приложения, что, вероятно, является наилучшим подходом для вашего варианта использования.

Если вы просто хотите избавиться от предупреждения, вы можете объявить тип executeStartup как Любой

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