1

根据 Apple 的 Swift 指南,当您拥有以下 Array 和以下函数来搜索 Array 时:

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 个语句合并为一个来简化代码 - 让我感到困惑,因为他们突然放弃了可选的“?” 和 ”!” 从他们的语法:

if let nameIndex = findName("Lisa", arrayToSearchIn: namesArray) {
   println("found \(namesArray[nameIndex])")
}

这非常有效。

那么为什么在第一个示例nameIndex中声明为“?” - 像这样:

nameIndex:Int?

并且使用“!”进行强制展开

[nameIndex!]

但在第二个例子中既不是“?” 或者 ”!” 一个在语法中使用?

4

2 回答 2

3

an中声明的处理if let是特殊的;应该将其视为自己的语言结构(而不​​是和的简单组合iflet。在

if let nameIndex = findName("Lisa", arrayToSearchIn: namesArray) {
   println("found \(namesArray[nameIndex]")
}

的类型nameIndex不需要表示,因为它可以推断为的返回类型findName()Int?。在主体中,if let ...的值nameIndex未绑定到可选值,因此不需要展开 - 值将是Int.

这是如何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

但是,如果您尝试在 之外如此“灵活” if let,则会从编译器中得出一个错误:

> let y : Int = test ()
<REPL>:33:15: error: value of optional type 'Int?' not unwrapped; 
   did you mean to use '!' or '?'?
于 2014-06-11T19:19:01.020 回答
0

?是显式声明可选类型的运算符。!是强制解包可选的运算符。示例中的语法是一种特殊的 Swift 简写,用于在一个简洁的行中检查和展开。它说,“分配nameIndex给 的结果findName(...),如果不是nil,则运行以下代码:...”</p>

于 2014-06-11T19:12:16.893 回答