'dispatch_once_t' is unavailable in Swift: Use lazily initialized globals instead [duplicate]

旧时模样 提交于 2019-12-20 09:49:57

问题


I am having trouble with dispatch_once_t when migrating to Swift 3.

According to Apple's migration guide:

The free function dispatch_once is no longer available in Swift. In Swift, you can use lazily initialized globals or static properties and get the same thread-safety and called-once guarantees as dispatch_once provided. Example:

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.

So I wanted to migrate this code. So it was before migration:

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!
}

After the migration, following the Apple's guidelines (manual migration), the code looks like this:

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

    _ = Static.token

    return Static.instance!
}

But when I run this I get the following error when accessing return Static.instance!:

fatal error: unexpectedly found nil while unwrapping an Optional value

I see from this error that the instance member is nil, but why is it? Is it something wrong with my migration?


回答1:


That code was overly verbose even though it was valid in Swift 2. In Swift 3, Apple forces you to use lazy initialization through closure:

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


来源:https://stackoverflow.com/questions/38516822/dispatch-once-t-is-unavailable-in-swift-use-lazily-initialized-globals-instea

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!