为什么常量继承“String?”键入而不是“字符串?”

时间:2016-06-07 02:55:54

标签: swift

在以下代码行中,anotherVariable常量从右侧隐式继承String类型而不是String?

var variable: String? = "hello"

if let anotherVariable = variable { // Unwrapping
  // "anotherVariable" constant has a String type and its value is "hello"
}

3 个答案:

答案 0 :(得分:2)

是的,这是optional unwrapping。在可选值上使用if let时:

  1. 如果可选值为非零,则只输入条件的主体
  2. 您为其指定的值将是非可选类型,因此您可以在不在条件正文范围内展开的情况下使用它。

答案 1 :(得分:2)

正如你的评论所说,

if let的意思是“展开”。 String?的展开版本为String。因此,如果string获得任何值,它将是String值,并且编译器知道这一点。

答案 2 :(得分:0)

基本上,Swift为您提供安全解包选项的约定。 If let行基本上说:

  • 展开示例并将值分配给新的常量示例(这可能看起来有点令人困惑)
  • 如果成功,并且新的常量示例等于展开的变量示例,请执行代码块。
  • 注意:如果var示例为nil,则assingment将失败,因为nil不等于任何内容,包括nil,并且将跳过代码块。

有些人发现在if let语句中使用相同的参数名称会让人感到困惑。我更喜欢这种方式,但将它命名为其他东西是完全可以接受的,例如:

if let unwrappedExample = example {
...   //unwrappedExample now has the unwrapped example value (if not nil)
}

如果你是初学者,处理选项可能是一次新的冒险,但它们很快就会成为你的第二天性!希望这有帮助!