因此,如果字符串不是 NilLiteralConvertible... 一些字符串函数 return 有什么作用?

So if string is not NilLiteralConvertible... what do some string functions return?

让我们假设以下代码:

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

stringByRemovingPercentEncoding 应该 return 一个可选的字符串。所以让我们打开它。现在当它实际上 'fails' 而不是 return 字符串时会发生什么?

String 不是 NilLiteralConvertible,因此下一行出现编译器错误。我在这里真的很困惑——如果我假设 url.stringByRemovingPercentEncoding 是一个未包装的可选值,我应该将 urlString 与什么进行比较?显然它不适用于 nil。

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

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

这是有道理的。为什么我们 想要 Stringnil 之间使用任何比较运算符。 String不能nil.

现在,url.stringByRemovingPercentEncoding 有一个 return 类型的 String?,但我们使用的是隐式解包可选,这意味着 urlString 要么是 String 并有一个值,否则我们会得到一个致命错误(意外地发现 nil 展开一个可选的)。

如果我们删除我们的隐式解包运算符:

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

现在代码很完美了。我们的变量 urlString 现在不是 String,而是 String?。我们可以使用 != 将任何可选值与 nil 进行比较,因为可选值 可以为 nil!

但也许最 Swifty 的写法如下所示:

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

在这个场景中,urlStringString类型的,所以我们不用解包,但是if块只是进入(而且我们只能使用urlStringif 块内)当且仅当 url.stringByRemovingPercentEncoding return 是非零。


郑重声明,如果我们实际上不打算对 urlString 做任何事情,我们有以下两个选择:

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

还有:

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