Asignación opcional implícitamente desenvuelta en Xcode 8

En la versión de lanzamiento de Xcode 8, encontré una escena extraña.

Aquí está el código,

let implicitlyUnwrappedOptionalString: String! = "implicitlyUnwrappedOptionalString" let foo = implicitlyUnwrappedOptionalString print(implicitlyUnwrappedOptionalString) print(foo) 

y aqui esta el resultado:

 implicitlyUnwrappedOptionalString Optional("implicitlyUnwrappedOptionalString") 

Los anteriores muestran que cuando asigno una opción opcional no envuelta implícitamente a una variable sin un tipo explícito, el tipo se deduce a un tipo opcional, no al tipo que originalmente es, también conocido como implícitamente desenvuelto .

Mi Xcode se ha actualizado a 8. ¿Alguien puede verificar el comportamiento en Xcode 7.x?

El cambio se debe a la modificación de la versión Swift o al Xcode?

Esto es una consecuencia de SE-0054 Abolish ImplicitlyUnwrappedOptional type que se ha implementado en Swift 3. Extracto de esa propuesta (énfasis agregado):

Sin embargo, la apariencia de! al final de un tipo de statement de propiedad o variable ya no indica que la statement tiene el tipo de IUO; más bien, indica que (1) la statement tiene un tipo opcional, y (2) la statement tiene un atributo que indica que su valor puede ser implícitamente forzado. …

Si la expresión puede verificarse explícitamente con un fuerte tipo opcional, lo será. Sin embargo, el verificador de tipos volverá a forzar el opcional si es necesario. El efecto de este comportamiento es que el resultado de cualquier expresión que se refiera a un valor declarado como T! tendrá tipo T o tipo T ?. Por ejemplo, en el siguiente código:

 let x: Int! = 5 let y = x let z = x + 0 

… x se declara como IUO, pero dado que el inicializador para el tipo y revisa correctamente como opcional, y se enlazará como tipo Int ?. Sin embargo, el inicializador para z no escribe verificación con x declarado como opcional (no hay sobrecarga de + que toma una opción), por lo que el comstackdor fuerza el tipo opcional y comprueba el inicializador como Int.

En tu caso, la tarea

 let foo = implicitlyUnwrappedOptionalString 

hace que foo sea ​​una opción fuerte, como en el ejemplo let y = x de la propuesta.

Puedes hacer foo an IUO agregando una anotación de tipo explícito

 let foo: String! = implicitlyUnwrappedOptionalString 

pero en general debe tratar de deshacerse de IUO en su código, como se indica en la misma propuesta:

A excepción de algunos escenarios específicos, los opcionales siempre son la apuesta más segura, y nos gustaría alentar a las personas a usarlos en lugar de IUO.