我正在学习快速语法,并有点混淆了可选类型。因此,根据定义,除非显式地将空值定义为可选值,否则from类型不能存储空值。那么,下面一行中的变量在声明时包含了什么。
var a:Int (declaring a variable without intializing it working fine in swift 3)当我们用"!“声明变量为可选变量时,
var optionalSquare: Square! = Square(sideLength: 10, name: "Optional Square")如果我们想使用"optionalSquare“变量,我们不需要展开它,因为我们确信(我认为这就是我们使用"!”的原因。)而不是“?”它不包含任何空值。所以我们为什么不把它声明为一个正常变量。
请纠正任何虚假陈述。谢谢。
发布于 2016-09-26 18:40:54
var a:Int在声明时包含了什么?
没什么。它的价值是未定义的。在赋值之前使用它的是编译错误。您可以在不初始化它的情况下声明它,但是不能使用它。
这是Swift的安全理念的一部分:在C中,您同样可以不初始化一个变量,并且它的值将是未定义的,但是如果您使用它,编译器(默认情况下)不会报告错误。
所以我们为什么不把它声明为一个正常变量。
我没有理由让局部变量成为隐式解包装的可选选项。该功能用于结构或类上的属性("ivars")。在不可能在对象的init中设置属性的情况下,您应该使用它们,但在使用对象之前,可以肯定该值是存在的。
IBOutlets可能是典型的用例。我发现另一个有用的方法是允许通过调用init中的方法来设置属性。
发布于 2016-09-26 18:43:26
那么,下面一行中的变量在声明时包含了什么。
这并不重要,因为您无论如何都无法访问它。这样的声明告诉Swift,您将在以后决定这个值。在赋值之前读取变量是编译器将要捕获的错误。
为什么我们不声明变量,强制展开它作为一个正常的变量?
因为您可能希望在不应该使用nil的时候将它存储在该变量中。
例如,您应该使IB分配的属性隐式地展开,因为在NIB对象被“膨胀”之前,但是在init方法完成之后,它们需要是init:
@IBOutlet private weak var myLabel: UILabel!为了使myLabel成为非可选的,您必须删除weak。另一方面,您不希望在每次访问myLabel时使用感叹号,因为您肯定知道它必须被初始化。
同样的推理也适用于您希望使之非可选的其他变量,但不能在初始化器中赋值。
发布于 2016-09-26 18:42:55
您可以声明一个非可选变量,而不是初始化它--只要您不使用该变量,编译器就不会抱怨。所以这个代码
var num: Int不会产生任何错误。但是,如果在初始化之前引用该变量,则编译将失败。
var num: Int
print(num)在前一种情况下,没有错误,因为初始化可以推迟。可以声明一个变量,然后在之后初始化100行。只要在初始化之前不引用它,就可以了。
为了回答第二个问题,正确的说法是,在许多情况下,声明和上下文初始化一个隐式未包装变量没有多大意义:非可选变量更合适。
https://stackoverflow.com/questions/39709912
复制相似问题