'dispatch_once_t'在Swift中不可用:改为使用延迟初始化的全局变量

Vla*_*Nul 23 swift swift3

dispatch_once_t在迁移到Swift 3 时遇到了麻烦.

根据Apple的迁移指南:

Swift中不再提供免费函数dispatch_once.在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!
}
Run Code Online (Sandbox Code Playgroud)

迁移后,遵循Apple的指导原则(手动迁移),代码如下所示:

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

    _ = Static.token

    return Static.instance!
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个时,我在访问时遇到以下错误return Static.instance!:

致命错误:在展开Optional值时意外发现nil

我从这个错误中看出该instance成员是nil,但为什么呢?我的迁移有问题吗?

Cod*_*ent 20

该代码过于冗长,即使它在Swift 2中有效.在Swift 3中,Apple强制您通过闭包使用延迟初始化:

class CarsConfigurator {
    static let sharedInstance: CarsConfigurator = { CarsConfigurator() }()
}
Run Code Online (Sandbox Code Playgroud)