Donc, si la string n'est pas NilLiteralConvertible … que returnnent certaines fonctions de string?

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 type Ssortingng et nil

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") }