Swift可选项,展开



我正在学习swift语法,与可选类型有点混淆。因此,从定义来看,swift类型不能存储空值,除非它被显式定义为可选的。那么,下面一行中的变量在声明时包含了什么呢?

var a:Int  (declaring a variable without intializing it working fine in swift 3)

当我们用"!"声明一个变量为可选变量时,

var optionalSquare: Square! = Square(sideLength: 10, name: "Optional Square")

如果我们想使用"optionalSquare"变量,我们不需要打开它,因为我们确定(我认为这就是为什么我们使用"!"而不是"?")它不包含任何空值。我们为什么不把它声明为一个正常变量呢?

请纠正错误的陈述。谢谢你。

[var a:Int]在声明

时包含什么

。其值未定义。在赋值之前使用它会导致编译错误。你可以声明而不初始化它,但是你不能使用它。

这是Swift安全哲学的重要组成部分:在C中,你同样可以不初始化一个变量,它的值将是未定义的,但是如果你使用它,编译器不会(默认情况下)报告错误。

那么我们为什么不把它声明为一个普通的变量呢?

我没有理由认为局部变量是隐式解包装的可选变量。该功能用于结构体或类上的属性("ivars")。您应该在不可能在对象的init中设置属性的情况下使用它们,但可以肯定的是,该值将在使用对象之前出现。

IBOutlet可能是规范的用例。我发现另一个有用的用法是允许通过调用init中的方法来设置属性。

那么,下面一行中的变量在声明时包含了什么呢?

没关系,因为无论如何你都不能访问它。像这样的声明告诉Swift你将稍后决定这个值。在赋值前读取变量是编译器会捕捉到的错误。

为什么我们不声明[变量强制展开]作为一个普通的变量?

因为您可能希望在不应该使用nil的时候将其存储在该变量中。

例如,您应该使ib分配的属性隐式地展开,因为它们需要在NIB对象"膨胀"之前成为nil,但在init方法完成之后:

@IBOutlet private weak var myLabel: UILabel!

为了使myLabel非可选,你必须放弃weak。另一方面,您不希望在每次访问myLabel时都使用感叹号,因为您肯定知道它必须初始化。

同样的道理也适用于其他你想使其不可选,但不能在初始化器中赋值的变量。

你可以声明一个非可选变量而不初始化它——只要你使用该变量,编译器就不会报错。所以这个代码

var num: Int

不会产生任何错误。但是,如果在初始化之前引用该变量,则编译失败

var num: Int
print(num)

在前一种情况下没有错误,因为初始化可以延迟。您可以声明一个变量,然后在100行之后初始化。只要在初始化之前不引用它,就没有问题。

回答你的第二个问题,正确的说法是,在许多情况下,声明和上下文初始化隐式解包装变量没有多大意义:非可选变量更合适。

最新更新