所以,如果string不是NilLiteralConvertible …一些string函数返回什么?
我们假设下面的代码:
let url = "http://%20abc" let urlString = url.stringByRemovingPercentEncoding! if urlString != nil { println("done") }
stringByRemovingPercentEncoding
应该返回一个可选的String。 所以让我们解开它。 现在发生什么事情,当它真的“失败”,并不返回一个string?
string不是NilLiteralConvertible,因此下一行有一个编译器错误。 我真的很困惑 – 所以我应该怎么比较urlString
,如果我认为url.stringByRemovingPercentEncoding
是一个解包可选? 显然这不是无效的。
请注意,我可以将urlString作为一个可选的值,然后解开它,等等。这不是重点。 关键是这个确切的情况。 非常感谢!
let url = "http://%20abc" let urlString = url.stringByRemovingPercentEncoding! if urlString != nil { println("done") }
我得到的错误是在!=
,它说:
二元运算符
!=
不能应用于String
types和nil
types的操作数
这是有道理的。 为什么我们甚至想要在String
和nil
之间使用任何比较运算符。 一个String
不能 nil
。
现在, url.stringByRemovingPercentEncoding
有一个返回types的String?
,但是我们正在使用隐式解包可选,这意味着urlString
将是一个String
并有一个值,否则我们会得到一个致命错误(意外发现nil
打开可选)。
如果我们删除我们的隐式不包装运算符:
let url = "http://%20abc" let urlString = url.stringByRemovingPercentEncoding if urlString != nil { println("done") }
现在代码非常高兴。 而不是一个String
,我们的variables, urlString
现在是一个String?
。 我们可以使用!=
比较任何可选项和nil
因为可选项可以是零 !
但也许写这个最Swifty的方式是这样的:
let url = "http://%20abc" if let urlString = url.stringByRemovingPercentEncoding { // do something with urlString println("done") }
在这种情况下, urlString
是String
types的,所以我们不必打开它,但if
块只进入(我们只能在if
块中使用urlString
)当且仅当url.stringByRemovingPercentEncoding
返回一个non-零。
而为了logging,如果我们实际上没有对urlString
做任何事情,我们有以下两种select:
if url.stringByRemovingPercentEncoding != nil { println("done") }
并且:
if let _ = url.stringByRemovingPercentEncoding { println("done") }