07-18-2023, 08:58 PM
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?
According to [Apple's migration guide](
[To see links please register here]
):> 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?