';发送一次';在Swift中不可用:请改用延迟初始化的全局变量

';发送一次';在Swift中不可用:请改用延迟初始化的全局变量,swift,swift3,Swift,Swift3,在迁移到Swift 3时,我在dispatch\u once\t方面遇到问题 根据: Swift中不再提供免费功能dispatch_once。在里面 Swift,您可以使用延迟初始化的全局或静态属性和 获得与dispatch_once相同的线程安全性和一次调用保证 假如例如: let myGlobal={…global在对闭包的调用中包含初始化…}() \=myGlobal//使用myGlobal将仅在第一次使用时调用初始化代码。 所以我想迁移这段代码。所以在移民之前: class var sh

在迁移到Swift 3时,我在
dispatch\u once\t
方面遇到问题

根据:

Swift中不再提供免费功能dispatch_once。在里面 Swift,您可以使用延迟初始化的全局或静态属性和 获得与dispatch_once相同的线程安全性和一次调用保证 假如例如:

let myGlobal={…global在对闭包的调用中包含初始化…}()

\=myGlobal//使用myGlobal将仅在第一次使用时调用初始化代码。

所以我想迁移这段代码。所以在移民之前:

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!
}
迁移之后,按照苹果的指导方针(手动迁移),代码如下所示:

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

    _ = Static.token

    return Static.instance!
}
但是当我运行这个程序时,当访问
return Static.instance时,我会遇到以下错误

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


我从这个错误中看到
实例
成员是
nil
,但为什么是这样?我的迁移有什么问题吗?

尽管在Swift 2中是有效的,但代码过于冗长。在Swift 3中,Apple通过闭包强制您使用延迟初始化:

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

Swift 3
中删除一次
dispatch\u
。检查一次关于如何做事情的答案