Подтвердить что ты не робот

'dispatch_once_t' недоступен в Swift: вместо этого используйте лениво инициализированные глобальные переменные

У меня возникают проблемы с dispatch_once_t при переносе на Swift 3.

В соответствии с Руководством по миграции Apple:

Бесплатная функция dispatch_once больше не доступна в Swift. В Swift, вы можете использовать лениво инициализированные глобальные или статические свойства и получить одинаковые гарантии безопасности потоков и позвонил один раз как dispatch_once предоставлена. Пример:

let myGlobal = { … global contains initialization in a call to a closure … }()

_ = myGlobal // using myGlobal will invoke the initialization code only the first time it is used.

Итак, я хотел перенести этот код. Так было до миграции:

class var sharedInstance: CarsConfigurator
{
    struct Static {
        static var instance: CarsConfigurator?
        static var token: dispatch_once_t = 0
    }

    dispatch_once(&Static.token) {
        Static.instance = CarsConfigurator()
    }

    return Static.instance!
}

После миграции, следуя рекомендациям Apple (ручная миграция), код выглядит следующим образом:

class var sharedInstance: CarsConfigurator
{
    struct Static {
        static var instance: CarsConfigurator?
        static var token = {0}()
    }

    _ = Static.token

    return Static.instance!
}

Но когда я запускаю это, я получаю следующую ошибку при доступе к return Static.instance!:

фатальная ошибка: неожиданно найден nil при развертывании необязательного значения

Из этой ошибки видно, что член instance nil, но почему он? Это что-то не так с моей миграцией?

4b9b3361

Ответ 1

Этот код был слишком многословным, хотя он был действителен в Swift 2. В Swift 3 Apple заставляет вас использовать ленивую инициализацию через закрытие:

class CarsConfigurator {
    static let sharedInstance: CarsConfigurator = { CarsConfigurator() }()
}