2015-03-24 78 views

回答

4

通过使用var contacts: [Person]!您实际上不初始化Person数组。

var contacts: [Person]! // contacts still nil 
var contacts = [Person]() // Person array with 0 objects 

如果使用(),而不是你初始化一个空Person阵列。在斯威夫特

0

操作:不声明,其只是说该类型的变量是

算=是如在所有其他语言声明操作者在这种情况下,随后的(),它在此情况下宣布一个新的人数组。

+0

“Operator = is ... a declaring operator”这个'='没有声明任何东西,它给lhs分配一个值,它是声明的'var' – 2015-03-24 23:32:44

+0

这是真的,我需要练习我的术语 – Arbitur 2015-03-24 23:53:12

1

变量声明采用以下格式:

var name: Type = initialValue 

也就是说,需要声明一个名为的一些Typename变量,并将其设置为一个initialValue

虽然有很多简写形式,所以你会看到各种选择。你最常看到的是离开Type部分。如果这样做,那么name的类型是从initialValue“推断”的。

这就是var contacts = [Person]()正在发生的事情。该类型是PersonArray()正在调用初始化程序(即创建数组)。

或者,您可以声明一个带有类型的变量,但不会给它一个初始值。但编译器不会让你使用它,直到你保证将它设置为初始值。因此,例如,您可以编写var contacts: [Person],然后编写contacts = [Person]()

当写var contacts: [Person]!,具有!,你正在声明Optional<[Person]>类型的变量 - 即,类型,它们可以是nil,或包含阵列。与常规数组不同,如果不初始化数组,则数组的可选项具有默认值值。默认值是nil - 也就是说,可选的不是包含一个数组。

!(而不是更常见的?)意味着它被声明为一种特殊的可选项,称为“隐式解包可选” - 也就是说,当您以某种方式使用它时,就好像它不是可选。这样做的一大缺点是它可以让你使用它,就好像它不是可选的一样。但如果你这样做,它是nil然后你的程序将崩溃。因此,任何人使用contacts之前,它需要被初始化(如与contacts = [Person]()或指定某些现有阵列的话)

出于这个原因,最好不使用这些隐式展开自选除非是非常特殊的情况。他们有时看起来很方便,但他们通常不是最好的选择,因为他们很危险。

0

其他人提供了差异,我会给你什么时候应该使用的情景。

var contacts: [Person]! //implicitly unwrapped optional. #1 
var contacts = [Person]() //array initialization. #2 

我使用#1,当我创建一个变量,它不会被它自己的类初始化。当我实现一个接收另一个控制器传递的信息的详细视图时,会出现这种情况。

对于#2,当您想要初始化一个新的空数组时使用。

相关问题