Swift可选类型语法

时间:2014-06-11 19:10:19

标签: swift optional optional-variables optional-values

根据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!]

但在第二个例子中,"?"或"!"一个用在语法中?

2 个答案:

答案 0 :(得分:3)

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

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,请运行以下代码:...”