the programming para language descargar swift swift3

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í:

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() }() }