为什么我需要在swift中的数组声明结尾处使用大括号?

时间:2015-01-30 06:20:46

标签: ios swift ios8

我一直在谷歌上搜索一下,每个教程都教我创建一个数组,你只需要做以下事情:

var persons = [String]

但是我正在从快速代码转向iOS开发学习资料,现在到处都是

var persons = [String]()

为什么我们最后需要那些括号?

2 个答案:

答案 0 :(得分:6)

似乎你混淆了两个概念:变量声明和变量赋值。

要在Swift中声明一个空数组,您必须明确说明数组可以容纳的类型。您可以使用长手定义执行此操作:

var persons: Array<String>

或简写语法(首选):

var persons: [String]

注意使用冒号“:”而不是等于“=”。

这两个都在说“我宣称存在一个名为'people'的变量(不是常数),它将是一个充满字符串的可变数组。但是现在它还是未定义的。”

在Obj-C中,你可以将任何类型的对象放入NSArray中,这意味着你无法确定你将从中获得什么。以这种方式声明Array内容是Swift的Type安全功能之一。您可以确信persons只会包含String个实例。

为您的变量赋值,这意味着它不仅具有定义,而且还在内存中分配了一个有效对象,您必须实际初始化该数组:

var persons = [String]() 

这实际上是一种初始化一个空数组的简便方法,该数组将保存某个Type,而不会将任何参数传递给init:方法。在此之后,persons实际上有一个值,这是一个完全空的数组,只允许包含字符串。

或者,Swift的Array Type有一个第二个初始化器,可以让你传递参数:

init(count: Int, repeatedValue: T)

您可以使用它来创建一个具有设定长度和初始值的数组:

let immutableBobsArray = Array(count: 3, repeatedValue: "Bob")

println(\(immutableBobsArray))  \\ ["Bob", "Bob", "Bob"]

请参阅Apple的Swift编程指南中的"Collection Types",以及the Array entry in the Swift Standard Library

答案 1 :(得分:3)

[String]是Swift中类型的名称。具体来说,它是Array<String>类型,它是通用Array<T>类型的参数化版本。就像语句var number = Int没有任何意义,除非您明确告诉编译器您正在构建特定类型的实例。

您想要的是var persons = [String](),或者,如果您想使用数组文字指定变量的初始值,则可以执行var persons: [String] = []。请注意,在第二个选项中,我们被迫指定变量的类型,因为Swift的类型推断无法计算出空数组的类型([]保持什么值?)。