所以,如果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") } 

我得到的错误是在!= ,它说:

二元运算符!=不能应用于Stringtypes和niltypes的操作数

这是有道理的。 为什么我们甚至想要Stringnil之间使用任何比较运算符。 一个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") } 

在这种情况下, urlStringStringtypes的,所以我们不必打开它,但if块只进入(我们只能在if块中使用urlString )当且仅当url.stringByRemovingPercentEncoding返回一个non-零。


而为了logging,如果我们实际上没有对urlString做任何事情,我们有以下两种select:

 if url.stringByRemovingPercentEncoding != nil { println("done") } 

并且:

 if let _ = url.stringByRemovingPercentEncoding { println("done") }