因此,如果字符串不是 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
这是有道理的。为什么我们 想要 在 String
和 nil
之间使用任何比较运算符。 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")
}
在这个场景中,urlString
是String
类型的,所以我们不用解包,但是if
块只是进入(而且我们只能使用urlString
在 if
块内)当且仅当 url.stringByRemovingPercentEncoding
return 是非零。
郑重声明,如果我们实际上不打算对 urlString
做任何事情,我们有以下两个选择:
if url.stringByRemovingPercentEncoding != nil {
println("done")
}
还有:
if let _ = url.stringByRemovingPercentEncoding {
println("done")
}
让我们假设以下代码:
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 typeString
andnil
这是有道理的。为什么我们 想要 在 String
和 nil
之间使用任何比较运算符。 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")
}
在这个场景中,urlString
是String
类型的,所以我们不用解包,但是if
块只是进入(而且我们只能使用urlString
在 if
块内)当且仅当 url.stringByRemovingPercentEncoding
return 是非零。
郑重声明,如果我们实际上不打算对 urlString
做任何事情,我们有以下两个选择:
if url.stringByRemovingPercentEncoding != nil {
println("done")
}
还有:
if let _ = url.stringByRemovingPercentEncoding {
println("done")
}