在swift中声明这些变量时有什么区别!要么 ()

时间:2015-03-24 23:14:42

标签: ios swift

以这种方式声明变量有什么区别?

var contacts: [Person]!
var contacts = [Person]()

4 个答案:

答案 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,在想要初始化新的空数组时使用。