У меня возникают проблемы с 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
, но почему он? Это что-то не так с моей миграцией?