为什么在 swift 中的数组声明末尾需要大括号?

Why do I need braces at the end of an array declaration in swift?

我用谷歌搜索了一段时间,每个教程都教我创建数组,只需执行以下操作:

var persons = [String]

但我正在从 swift 代码转向 iOS 开发学习 material 现在无处不在

var persons = [String]()

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

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

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

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

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

var persons: Array<String>

或 shorthand 语法(首选):

var persons: [String]

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

这两个都在说 "I'm declaring the existence of a variable (not constant) called 'persons' which will be a mutable Array full of Strings. Right now it's undefined though."

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

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

var persons = [String]() 

这本质上是一种 shorthand 方法来初始化一个将包含特定类型的空数组,而无需将任何参数传递给 init: 方法。在此之后,persons实际上有一个值,它是一个完全空的数组,只允许包含字符串。

或者,Swift 的数组类型有第二个初始化程序,可让您传递参数:

init(count: Int, repeatedValue: T)

您可以使用它来创建数组 w/a 设置长度和初始值:

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

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

参见 "Collection Types" in the Apple's Swift Programming Guide, and also the Array entry in the Swift Standard Library