Swift入门: 数组

2020-03-19 20:41:44 浏览数 (1)

数组允许您将许多值组合到一个集合中,然后根据它们在集合中的位置访问这些值。Swift使用类型推断来确定数组保存的数据类型,如下所示:

代码语言:javascript复制
var evenNumbers = [2, 4, 6, 8]
var songs = ["Shake it Off", "You Belong with Me", "Back to December"]

如您所见,Swift使用中括号标记数组的开始和结束,数组中的每个项都用逗号分隔。

在读取数组中的项目时,有一个陷阱:Swift从0开始计数。这意味着第一项是0,第二项是1,第三项是2,依此类推。试着把这个放到你的操场上:

代码语言:javascript复制
var songs = ["Shake it Off", "You Belong with Me", "Back to December"]
songs[0]
songs[1]
songs[2]

这将在结果窗格中打印“Shake it Off”、“You Belong with Me”和“Back to December”。

项在数组中的位置称其为索引,您可以通过提供其索引从数组中读取任何项。但是,您确实需要小心:我们的数组中有三个项,这意味着索引0、1和2工作得很好。但如果你试着读songs[3],你的Playground就会停止工作——如果你在一个真正的应用程序中试过,它就会崩溃!

因为您通过给数组三个字符串来创建数组,所以Swift知道这是一个字符串数组。您可以在操场上使用一个特殊命令来确认这一点,该命令将打印出任何变量的数据类型,如下所示:

代码语言:javascript复制
var songs = ["Shake it Off", "You Belong with Me", "Back to December"]
type(of: songs)

这将在结果窗格中打印Array<String>.Type,告诉您Swift将songs视为字符串数组。

假设你犯了个错误,不小心在数组的末尾加了一个数字。现在试试这个,看看结果窗格会打印什么:

代码语言:javascript复制
var songs = ["Shake it Off", "You Belong with Me", "Back to December", 3]
type(of: songs)

这次你会看到一个错误。错误并不是因为Swift不能处理这样的混合数组,我将在稍后向您展示如何处理这些数组!——但相反,因为Swift是乐于助人的。您将看到的错误消息是,“heterogenous collection literal could only be inferred to '[Any]; add explicit type annotation if this is intentional.”;或者,用通俗的话来说,“这个数组看起来是为保存大量类型的数据而设计的—如果您真的是这样想的,请将其显式化为[Any]。”

类型安全是很重要的,尽管Swift可以使数组保存任何类型的数据,但这是一个意外。幸运的是,我已经说过可以使用类型注释来确切地指定希望数组存储的数据类型。要指定数组的类型,请编写要存储的数据类型,并在其周围加上括号,如下所示:

代码语言:javascript复制
var songs: [String] = ["Shake it Off", "You Belong with Me", "Back to December", 3]

既然我们已经告诉Swift我们只想在数组中存储字符串,它总是拒绝运行代码,因为3不是字符串。

如果确实希望数组保存任何类型的数据,请使用特殊的Any数据类型,如下所示:

代码语言:javascript复制
var songs: [Any] = ["Shake it Off", "You Belong with Me", "Back to December", 3]
创建数组

如果使用上面显示的语法创建数组,Swift将创建数组并用我们指定的值填充它。如果你想创建数组然后稍后填充它,事情就不那么简单了——下面这种语法不起作用:

代码语言:javascript复制
var songs: [String]
songs[0] = "Shake it Off"

原因是一开始看起来不必要的迂腐,但有深刻的潜在性能影响,所以我恐怕你只能接受它了。简单地说,编写var songs:[String]告诉Swift“songs变量将保存一个字符串数组”,但实际上它并没有创建该数组。它不分配任何RAM,也不做任何实际创建Swift数组的工作。它只是说在某个地方上会有一个数组,它会保存字符串。

有几种方法可以正确表达这一点,而此时最有意义的方法可能是:

代码语言:javascript复制
var songs: [String] = []

它使用一个类型注释来说明我们需要一个字符串数组,并为它分配一个空数组(即[]部分)。

您通常还会看到以下构造:

代码语言:javascript复制
var songs = [String]()

这意味着同样的事情:()告诉Swift我们要创建有问题的数组,然后使用类型推断将其分配给songs。这个选项短了两个字符,所以程序员喜欢它也就不足为奇了!

数组运算符

可以在数组上使用有限的一组运算符。例如,可以使用 运算符合并两个数组,如下所示:

代码语言:javascript复制
var songs = ["Shake it Off", "You Belong with Me", "Love Story"]
var songs2 = ["Today was a Fairytale", "Welcome to New York", "Fifteen"]
var both = songs   songs2

您还可以使用 =来添加和分配,如下所示:

代码语言:javascript复制
both  = ["Everything has Changed"]

本文来自Hacking with Swift给swift初学者的入门课程Swift for Complete Beginners 的 Arrays

0 人点赞