XCode Fix-it suggère que la force déballe un bool?

J'ai essayé d'écrire ceci:

cardVC.hideStatusBar = rootNavController?.prefersStatusBarHidden() 

Mais XCode 7.0 s'est plaint d'une erreur:

Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?

J'ai cliqué sur le correctif suggéré et il est devenu:

cardVC.hideStatusBar = (rootNavController?.prefersStatusBarHidden())!

Que fait l'emballage entre parenthèses et en ajoutant ! faire exactement? Je comprends que cette force le déballe. Si rootNavController != nil , alors il y aura une valeur BOOL. Cependant, si rootNavController est nul, alors mon instruction originale rootNavController?.prefersStatusBarHidden() renvoie juste 0 (ou false) et c'est pourquoi nous pouvons forcer le déballer, renvoyant essentiellement faux si nul?

Si rootNavController != nil , alors il y aura une valeur BOOL

Correct.

Si rootNavController est nul, alors mon instruction originale rootNavController?.prefersStatusBarHidden() returnne simplement 0 (ou false)

Non. La déclaration originale reviendra à nil . Cette instruction peut être lue comme "si rootNavController n'est pas nil , returnne rootNavController.prefersStatusBarHidden() . Sinon, returnne nil ".

Comme indiqué dans les commentaires, la façon rapide de fournir une valeur par défaut lors du déballage d'un optionnel est à travers l' opérateur de coalescence nil : cardVC.hideStatusBar = rootNavController?.prefersStatusBarHidden() ?? false cardVC.hideStatusBar = rootNavController?.prefersStatusBarHidden() ?? false . Cette instruction fait ce que vous avez imaginé, et peut être lue comme "si rootNavController n'est pas nil , returnne rootNavController.prefersStatusBarHidden() . Sinon, returnne false".

Force-déballer un optionnel est quelque chose de différent. alors que rootNavController?.prefersStatusBarHidden() renvoie un optionnel, rootNavController!.prefersStatusBarHidden() renvoie toujours une valeur non nulle (bool dans ce cas). Forcer le déballage d'une valeur optionnelle avec une valeur nil provoquera le blocage de votre programme pendant l'exécution.

De même, votre instruction de décompression peut être lue comme "si rootNavController n'est pas nil , returnne rootNavController.prefersStatusBarHidden() .

Dans ma réponse à cette question, je fais une brève explication sur les options et le déballage de la force que vous voudrez peut-être examiner.