Supposons le code suivant:
let url = "http://%20abc" let urlSsortingng = url.ssortingngByRemovingPercentEncoding! if urlSsortingng != nil { println("done") }
ssortingngByRemovingPercentEncoding
doit renvoyer une string optionnelle. Alors, déballons-le. Maintenant, que se passe-t-il quand il échoue et ne renvoie pas de string?
Ssortingng n'est pas un NilLiteralConvertible, donc il y a une erreur de compilation sur la ligne suivante. Je suis vraiment confus ici – alors que dois-je comparer l' urlSsortingng
avec si je suppose que url.ssortingngByRemovingPercentEncoding
est un optionnel déballé? Évidemment, ça ne marche pas avec zéro.
S'il vous plaît noter que je pourrais laisser l'urlSsortingng comme une valeur facultative, puis le déplier, etc. Ce n'est pas le point. Le point est ce cas précis. Merci beaucoup!
let url = "http://%20abc" let urlSsortingng = url.ssortingngByRemovingPercentEncoding! if urlSsortingng != nil { println("done") }
L'erreur que je reçois est sur le !=
, Où il est dit:
L'opérateur binary
!=
Ne peut pas être appliqué à des opérandes de typeSsortingng
etnil
Ce qui a du sens. Pourquoi voudrions-nous même utiliser n'importe quel opérateur de comparaison entre Ssortingng
et nil
. Une Ssortingng
ne peut pas être nil
.
Maintenant, url.ssortingngByRemovingPercentEncoding
a un type de return de Ssortingng?
, mais nous utilisons l'option implicitement urlSsortingng
, ce qui signifie que urlSsortingng
sera soit une Ssortingng
et aura une valeur, soit nous obtiendrons une erreur fatale (de manière inattendue, nous ne pourrons pas déballer un optionnel).
Si nous supprimons notre opérateur de dépliage implicite:
let url = "http://%20abc" let urlSsortingng = url.ssortingngByRemovingPercentEncoding if urlSsortingng != nil { println("done") }
Maintenant, le code est parfaitement heureux. Au lieu d'être une Ssortingng
, notre variable, urlSsortingng
est maintenant une Ssortingng?
. Et nous pouvons utiliser !=
Pour comparer n'importe quel optionnel avec nil
car les options peuvent être nulles !
Mais peut-être la manière la plus Swifty d'écrire cela ressemble à ceci:
let url = "http://%20abc" if let urlSsortingng = url.ssortingngByRemovingPercentEncoding { // do something with urlSsortingng println("done") }
Dans ce scénario, urlSsortingng
est de type Ssortingng
, donc nous n'avons pas besoin de le déplier, mais le bloc if
entre seulement (et nous ne pouvons utiliser l' urlSsortingng
dans le bloc if) si et seulement si url.ssortingngByRemovingPercentEncoding
renvoie un non néant.
Et pour memory, si nous n'allons rien faire avec urlSsortingng
, nous avons les deux options suivantes:
if url.ssortingngByRemovingPercentEncoding != nil { println("done") }
et aussi:
if let _ = url.ssortingngByRemovingPercentEncoding { println("done") }