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.