根据Apple的Swift指南,如果你有以下数组和以下函数来搜索数组:
let namesArray = ["John", "Lisa", "Bill", "Jennifer"]
// Note this function is set-up to return an OPTIONAL Int:
func findName (personName:String, arrayToSearchIn:String[]) -> Int? {
for (indexOfName, nameValue) in enumerate(arrayToSearchIn) {
if nameValue == personName {
return indexOfName
}
}
return nil
}
...所以你可以捕获这个函数返回的Optional Int - 然后按照以下方式检查它是否nil
-
let nameIndex: Int? = findName("Lisa", arrayToSearchIn: namesArray)
if nameIndex {
println("found \(namesArray[nameIndex!])")
}
else {
println("NOT found")
}
这一切都很好 - 但他们的下一个例子,他们通过将2个语句折叠成一个来简化代码 - 让我感到困惑,因为他们突然放弃了Optional"?"和"!"从他们的语法:
if let nameIndex = findName("Lisa", arrayToSearchIn: namesArray) {
println("found \(namesArray[nameIndex])")
}
这非常有效。
那么为什么在第一个例子中nameIndex
被声明为"?" - 像这样:
nameIndex:Int?
并使用"!"
进行强制解包[nameIndex!]
但在第二个例子中,"?"或"!"一个用在语法中?
答案 0 :(得分:3)
if let
中声明的处理是特殊的;一个人应该将它视为自己的语言结构(而不是if
和let
的简单组合)。在
if let nameIndex = findName("Lisa", arrayToSearchIn: namesArray) {
println("found \(namesArray[nameIndex]")
}
nameIndex
的类型不需要表达,因为它可以推断为findName()
的返回类型Int?
。在if let ...
的正文中,nameIndex
的值未绑定到可选,因此不需要展开 - 该值将为Int
。< / p>
以下是如何处理if let
绑定的示例。请注意,该类型的显式声明基本上被忽略:
> func test () -> Int? { return 111 }
> if let x : Int? = test () { return x }
$R6: Int? = 111
> if let x : Int = test () { return x }
$R7: Int = 111
> if let x = test () { return x }
$R8: Int = 111
但如果你试图这么灵活&#39;在if let
之外,您从编译器中绘制错误:
> let y : Int = test ()
<REPL>:33:15: error: value of optional type 'Int?' not unwrapped;
did you mean to use '!' or '?'?
答案 1 :(得分:0)
?
是显式声明可选类型的运算符。 !
是强制解包可选项的运算符。示例中的语法是一个特殊的Swift简写,用于在一条简洁的行中进行检查和解包。它说,“将nameIndex
分配给findName(...)
的结果,如果不是nil
,请运行以下代码:...”