我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)
| 归档时间: |
|
| 查看次数: |
13985 次 |
| 最近记录: |