2016-06-07 49 views
-3

在下面的代码行中,anotherVariable恒定隐式地从右侧继承String类型,而不是String?为什么常量会继承“String?”键入而不是“字符串?”

var variable: String? = "hello" 

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

你的问题是什么?你问为什么变量'example'是'String?'而不是'String'? –

回答

2

对,这是optional unwrapping。当您在一个可选值使用if let

  1. 如果可选的值不为零,您只需输入条件的身体,
  2. ,你分配给它的价值将是一个非可选的类型,所以你可以使用它而不必在条件主体的范围内展开。
2

if let意思是“解包”,如您的评论所述。 String?的解包版本是String。因此,如果string得到的值为,则任何值都将为String值,编译器知道这一点。

0

基本上,斯威夫特给你这个约定安全地解开optionals。所述If let线基本上说:

  • 展开例如并分配值到新的常数的例子(这个初看起来混乱)
  • 如果它是成功的,而新的常数的例子是等于展开的可变例如,执行代码块。
  • 注意:如果var示例为零,则由于nil不等于任何内容(包括nil),因此assing会失败,并且代码块将被跳过。

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

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

与自选处理可以是一个新的冒险,如果你是新的,但他们很快就会成为你的第二天性!希望这可以帮助!

相关问题