Affectation optionnelle implicitement déballée dans Xcode 8

Dans la version Xcode 8, j'ai trouvé une scène étrange.

Voici le code,

let implicitlyUnwrappedOptionalSsortingng: Ssortingng! = "implicitlyUnwrappedOptionalSsortingng" let foo = implicitlyUnwrappedOptionalSsortingng print(implicitlyUnwrappedOptionalSsortingng) print(foo) 

Et voici le résultat:

 implicitlyUnwrappedOptionalSsortingng Optional("implicitlyUnwrappedOptionalSsortingng") 

Cela montre que lorsque j'affecte implicitement un optionnel déballé à une variable sans un type explicite, le type sera déduit d'un type optionnel, pas du type qu'il était à l'origine, alias implicitement déballé optionnel .

Mon Xcode a été mis à jour à 8. Tout le monde peut vérifier le comportement dans Xcode 7.x?

Le changement est dû à la modification de la version Swift ou au Xcode?

Ceci est une conséquence de SE-0054 Abolish ImplicitlyUnwrappedOptional type qui a été implémenté dans Swift 3. Extrait de cette proposition (emphase ajoutée):

Cependant, l'apparition de! à la fin d'une propriété ou le type de déclaration de la variable n'indique plus que la déclaration a le type IUO; plutôt, il indique que (1) la déclaration a le type facultatif, et (2) la déclaration a un atsortingbut indiquant que sa valeur peut être implicitement forcée. …

Si l'expression peut être vérifiée explicitement avec un type optionnel fort, ce sera le cas. Cependant, le vérificateur de type retombera à forcer l'option si nécessaire. L'effet de ce comportement est que le résultat de toute expression qui se réfère à une valeur déclarée comme T! aura soit le type T, soit le type T? Par exemple, dans le code suivant:

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

… x est déclaré comme un IUO, mais parce que l'initialiseur pour y type vérifie correctement comme optionnel, y sera lié comme type Int ?. Cependant, l'initialiseur pour z ne vérifie pas de type avec x déclaré comme optionnel (il n'y a pas de surcharge de + qui prend une option), donc le compilateur force l'optionnel et le type vérifie l'initialiseur comme Int.

Dans votre cas, la mission

 let foo = implicitlyUnwrappedOptionalSsortingng 

rend foo un fort facultatif, comme dans l'exemple let y = x de la proposition.

Vous pouvez créer un object IUO en ajoutant une annotation de type explicite

 let foo: Ssortingng! = implicitlyUnwrappedOptionalSsortingng 

mais généralement vous devriez essayer de vous débarrasser des IUO dans votre code, comme indiqué dans la même proposition:

À l'exception de quelques scénarios spécifiques, les options sont toujours le pari le plus sûr, et nous aimerions encourager les gens à les utiliser à la place des IUO.