所以如果string不是NilLiteralConvertible ......一些字符串函数会返回什么?

时间:2015-04-23 21:59:02

标签: ios swift optional

我们假设以下代码:

let url = "http://%20abc"
let urlString = url.stringByRemovingPercentEncoding!
if urlString != nil {
    println("done")
}

stringByRemovingPercentEncoding应该返回一个可选的String。所以让我们打开它。现在当它实际上“失败”并且没有返回字符串时会发生什么?

String不是NilLiteralConvertible,因此下一行会出现编译错误。我真的很困惑 - 所以如果我认为urlString是一个未包装的可选项,我应该如何比较url.stringByRemovingPercentEncoding?显然它不适用于nil。

请注意我可以将urlString保留为可选值,然后将其打开,等等。这不是重点。关键是这个确切的情况。非常感谢!

1 个答案:

答案 0 :(得分:3)

let url = "http://%20abc"
let urlString = url.stringByRemovingPercentEncoding!
if urlString != nil {
    println("done")
}

我到达的错误位于!=,其中显示:

  

二进制运算符!=无法应用于Stringnil

类型的操作数

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