以这种方式声明变量有什么区别?
var contacts: [Person]!
var contacts = [Person]()
答案 0 :(得分:4)
通过使用var contacts: [Person]!
,您实际上并未初始化Person数组。
var contacts: [Person]! // contacts still nil
var contacts = [Person]() // Person array with 0 objects
如果您使用()
,则初始化空的Person
数组。
答案 1 :(得分:1)
Swift中的变量声明采用以下形式:
var name: Type = initialValue
也就是说,您声明了一个名为name
的变量Type
,并将其设置为initialValue
。
虽然有很多简写形式,所以你会看到各种替代品。您最常见的是离开Type
部分。如果您这样做,那么name
中的initialValue
类型就会被推断出来。
这是var contacts = [Person]()
发生的事情。类型为Array
Person
。 ()
正在调用初始化程序(即创建数组)。
或者,您可以使用类型声明变量,但不能为其指定初始值。但是,在保证使用初始值设置之前,编译器不会让您使用它。例如,您可以编写var contacts: [Person]
,然后再编写contacts = [Person]()
。
当您使用var contacts: [Person]!
撰写!
时,您声明的是Optional<[Person]>
类型的变量 - 也就是说,类型可以是nil
,或者包含nil
数组。与常规数组不同,如果不初始化数组,则数组的选项具有默认值。默认值为!
- 也就是说,不的可选项包含数组。
但是?
(而不是更常见的nil
)意味着它被声明为一种特殊的可选类型,称为“隐式解包的可选” - 也就是说,它是一个可选的,当您以某种方式使用它时,将表现为不可选。这样做的一个重大缺点就是它会让你使用它,就像它不是一个可选项一样。但如果你这样做,那就是contacts
那么你的程序将崩溃。因此,在任何人使用contacts = [Person]()
之前,需要对其进行初始化(例如使用{{1}}或为其分配一些现有数组)
出于这个原因,除非在特定情况下,否则最好不要使用这些隐式解包的选项。它们有时看起来很方便,但它们通常不是最好的选择,因为它们很危险。
答案 2 :(得分:0)
操作员:没有声明,只是说变量是哪种类型
Operator =与其他语言一样,是一个声明运算符,在本例中后跟(),在本例中声明了一个新的Person数组。
答案 3 :(得分:0)
其他人提供了差异,我将为您提供何时应该使用的情景。
var contacts: [Person]! //implicitly unwrapped optional. #1
var contacts = [Person]() //array initialization. #2
当我创建一个不会被它自己的类初始化的变量时,我使用#1。当我实现一个接收另一个控制器传递的信息的详细视图时,就会出现这种情况。
对于#2,在想要初始化新的空数组时使用。