我们假设以下代码:
let url = "http://%20abc"
let urlString = url.stringByRemovingPercentEncoding!
if urlString != nil {
println("done")
}
stringByRemovingPercentEncoding
应该返回一个可选的String。所以让我们打开它。现在当它实际上“失败”并且没有返回字符串时会发生什么?
String不是NilLiteralConvertible,因此下一行会出现编译错误。我真的很困惑 - 所以如果我认为urlString
是一个未包装的可选项,我应该如何比较url.stringByRemovingPercentEncoding
?显然它不适用于nil。
请注意我可以将urlString保留为可选值,然后将其打开,等等。这不是重点。关键是这个确切的情况。非常感谢!
答案 0 :(得分:3)
let url = "http://%20abc" let urlString = url.stringByRemovingPercentEncoding! if urlString != nil { println("done") }
我到达的错误位于!=
,其中显示:
二进制运算符
类型的操作数!=
无法应用于String
和nil
哪个有道理。为什么我们甚至希望使用String
和nil
之间的任何比较运算符。 String
不能为nil
。
现在,url.stringByRemovingPercentEncoding
的返回类型为String?
,但我们正在使用隐式展开的可选项,这意味着urlString
将是String
并且具有一个值,或者我们会得到一个致命的错误(意外地发现nil
打开一个可选的)。
如果我们删除我们的隐式解包运算符:
let url = "http://%20abc"
let urlString = url.stringByRemovingPercentEncoding
if urlString != nil {
println("done")
}
现在代码非常开心。我们的变量String
现在是urlString
,而不是String?
。我们可以使用!=
将任意可选项与nil
进行比较,因为选项可以是!
但也许最常用的 Swifty 编写方式如下:
let url = "http://%20abc"
if let urlString = url.stringByRemovingPercentEncoding {
// do something with urlString
println("done")
}
在这种情况下,urlString
的类型为String
,因此我们不必打开它,但只会输入if
块(我们只能使用{{当且仅当urlString
返回非零时才在if
块内)。
并且为了记录,如果我们实际上不会对url.stringByRemovingPercentEncoding
做任何事情,我们有以下两个选项:
urlString
还有:
if url.stringByRemovingPercentEncoding != nil {
println("done")
}