para - the swift programming language pdf
''dispatch_once_t'' no está disponible en Swift: En su lugar, use globulares inicializados perezosamente (1)
Esta pregunta ya tiene una respuesta aquí:
- ¿A dónde dispatch_once en Swift 3? 7 respuestas
- Utilizando un modelo singleton dispatch_once en Swift 30 respuestas
Tengo problemas con dispatch_once_t
al migrar a Swift 3.
Según la guía de migración de Apple :
La función gratuita dispatch_once ya no está disponible en Swift. En Swift, puede usar propiedades globales estáticas o propiedades de inicio lento y obtener las mismas garantías de seguridad de subprocesos y llamadas una vez que dispatch_once. Ejemplo:
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.
Así que quería migrar este código. Así fue antes de la migración:
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!
}
Después de la migración, siguiendo las pautas de Apple (migración manual), el código se ve así:
class var sharedInstance: CarsConfigurator
{
struct Static {
static var instance: CarsConfigurator?
static var token = {0}()
}
_ = Static.token
return Static.instance!
}
Pero cuando ejecuto esto, obtengo el siguiente error al acceder a return Static.instance!
:
error fatal: se encontró inesperadamente nil mientras se desenvolvía un valor opcional
Veo por este error que el miembro de la instance
es nil
, pero ¿por qué lo es? ¿Es algo malo con mi migración?
Ese código era demasiado detallado a pesar de que era válido en Swift 2. En Swift 3, Apple te obliga a usar la inicialización perezosa hasta el cierre:
class CarsConfigurator {
static let sharedInstance: CarsConfigurator = { CarsConfigurator() }()
}