Swift可选项,展开

时间:2016-09-26 18:31:53

标签: ios swift optional

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

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

当我们将变量声明为带有“!”的可选项时,

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

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

请更正任何虚假陈述。谢谢。

3 个答案:

答案 0 :(得分:2)

  

[var a:Int] 在声明

时包含的内容

无。它的价值是不确定的。 在分配值之前使用它是编译错误。你可以在不初始化的情况下声明它,但你不能使用它。

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

  

那么我们为什么不将它声明为正常变量。

没有理由让我想到一个局部变量是一个隐式解包的可选项。该功能适用​​于结构或类的属性(“ivars”)。您应该在无法在对象的init中设置属性的情况下使用它们,但可以确定在使用对象之前该值将存在。

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

答案 1 :(得分:1)

  

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

没关系,因为无论如何都无法访问它。像这样的声明告诉Swift你将在稍后决定该值。在分配之前读取变量是编译器将要捕获的错误。

  

为什么我们不将[强制展开的变量]声明为正常变量呢?

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

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

@IBOutlet private weak var myLabel: UILabel!

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

同样的推理适用于您想要非可选的其他变量,但不能在初始化程序中分配。

答案 2 :(得分:0)

您可以声明一个非可选变量而不是初始化它 - 只要您使用该变量,编译器就不会抱怨。所以这段代码

var num: Int

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

var num: Int
print(num)

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

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