let url = "http://%20abc"
let urlString = url.stringByRemovingPercentEncoding!
if urlString != nil {
println("done")
}
的錯誤我得到的有在!=
,在那裏說:
Binary operator !=
cannot be applied to operands of the type String
and nil
這是合理的。爲什麼我們甚至要想要使用String
和nil
之間的任何比較運算符。 A String
不能是nil
。
現在,url.stringByRemovingPercentEncoding
有String?
返回類型,但是我們使用的是隱式展開可選的,這意味着urlString
要麼是String
,並有一個值,否則我們會得到一個致命錯誤(意外地發現nil
展開一個可選項)。
如果我們刪除我們的隱含展開操作:
let url = "http://%20abc"
let urlString = url.stringByRemovingPercentEncoding
if urlString != nil {
println("done")
}
現在的代碼是非常幸福的。我們的變量urlString
現在不是String
,而是String?
。我們可以使用!=
來比較任何可選項與nil
,因爲可選項可以不爲!
但也許寫這個最SWIFTY方式是這樣的:
let url = "http://%20abc"
if let urlString = url.stringByRemovingPercentEncoding {
// do something with urlString
println("done")
}
在這種情況下,urlString
是String
類型的,所以我們沒有解開它,但if
塊只有當url.stringByRemovingPercentEncoding
返回非零時,纔會進入(並且我們只能在if
塊內使用urlString
)。
並記錄在案,如果我們不是真的要做到與urlString
什麼,我們有以下兩種選擇:
if url.stringByRemovingPercentEncoding != nil {
println("done")
}
也:
if let _ = url.stringByRemovingPercentEncoding {
println("done")
}
發佈此問題30秒前,得到了一個downvote。小心解釋,親愛的downvoter,爲什麼? – Fygo
我沒有投票,但我猜是因爲你的代碼是一個顯而易見的非序列。根據答案,你隱式地解開可選,然後嘗試並將其視爲可選 – Paulw11
也可能是因爲它不清楚這與'NilLiteralConvertible'有什麼關係,這不是該代碼生成的錯誤。 – nhgrif