Swift-存储类型-数组

Swift提供了三种主集合类型,称为数组,集合和字典,用于存储值的集合。 数组是值的有序集合。 集合是唯一值的无序集合。 字典是键 - 值关联的无序集合。

可变集合

如果创建数组,集合或字典,并将其分配给变量,则创建的集合将是可变的。 这意味着您可以通过在集合中添加,删除或更改项目来更改(或变更)集合。 如果将数组,集合或字典分配给常量,那么该集合是不可变的,并且其大小和内容不能更改。

注意:在不需要更改集合的所有情况下创建不可变集合是一个好习惯。 这样做使您更容易理解您的代码,并使Swift编译器优化您创建的集合的性能。

数组

数组在有序列表中存储相同类型的值。 相同的值可以在不同位置多次出现在数组中。

数组类型速写语法

创建一个空数组

您可以使用初始化语法创建特定类型的空数组:

var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// Prints "someInts is of type [Int] with 0 items."
请注意,someInts变量的类型从初始化程序的类型推断为[Int]。

或者,如果上下文已经提供类型信息,如函数参数或已经输入的变量或常量,则可以使用空数组文本创建一个空数组,该数组以[](一对空方括号)表示:

someInts.append(3)
// someInts now contains 1 value of type Int
someInts = []
// someInts is now an empty array, but is still of type [Int]

使用默认值创建数组

Swift的数组类型还提供了一个初始化器,用于创建一个特定大小的数组,其所有值设置为相同的默认值。 你传递这个初始化器一个适当类型的默认值(称为repeating):以及该值在新数组中重复的次数(称为count):

var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]

通过两个数组相加来创建数组

您可以通过将具有兼容类型的两个现有数组与加法运算符(+)相加来创建新数组。 新数组的类型从添加在一起的两个数组的类型推断:(注意:两个数组中的元素类型必须一致)

var threeDoubles = Array(repeating: 3.1, count: 3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]

var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]

var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]

您还可以使用数组字面量初始化数组,这是将一个或多个值写入数组集合的简写方法。 数组文本被写为值列表,用逗号分隔,并用一对方括号括起来:
下面的示例创建一个名为shopping List的数组来存储字符串值:

var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList has been initialized with two initial items
shoppingList变量被声明为“一个字符串值数组”,写为[String]。 因为此特定数组已指定值类型为String,所以仅允许存储String值。 这里,shoppingList数组用两个字符串值(“Eggs”和“Milk”)初始化,并写在数组文本中。

字面量的初始化方法

var shoppingList = ["Eggs", "Milk"]
因为数组文本中的所有值都是相同的类型,Swift可以推断[String]是用于shoppingList变量的正确类型。

访问和修改数组

您可以通过其方法和属性或通过使用下标语法来访问和修改数组。
要找出数组中的元素个数,请使用其只读计数属性:

print("The shopping list contains \(shoppingList.count) items.")
// Prints "The shopping list contains 2 items."

使用布尔isEmpty属性作为检查count属性是否等于0的快捷方式:

if shoppingList.isEmpty {
    print("The shopping list is empty.")
} else {
    print("The shopping list is not empty.")
}
// Prints "The shopping list is not empty."

您可以通过调用数组的append(_ :)方法将新项添加到数组的末尾:

shoppingList.append("Flour")
// shoppingList now contains 3 items, and someone is making pancakes

或者,使用附加赋值运算符(+ =)附加一个或多个兼容项目的数组:("注意:"只能在确定类型的数组中拼接相同类型的数组,如果数组是Any类型的,则可以随便拼接)

shoppingList += ["Baking Powder"]
// shoppingList now contains 4 items
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList now contains 7 items

通过使用下标语法从数组中检索值,在数组名称后面的方括号中传递要检索的值的索引:

var firstItem = shoppingList[0]
// firstItem is equal to "Eggs"

您可以使用下标语法来更改给定索引处的现有值:

shoppingList[0] = "Six eggs"
// the first item in the list is now equal to "Six eggs" rather than "Eggs"

您也可以使用下标语法同时更改值的范围,即使替换值集的长度与要替换的范围不同。 以下示例将“Chocolate Spread”,“Cheese”和“Butter”替换为“Bananas”和“Apples”:

shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList now contains 6 items

在数组中插入元素
注意:您不能使用下标语法将新项附加到数组的末尾。
要在指定索引处将数据插入数组,请调用数组insert(_:at :)方法:

shoppingList.insert("Maple Syrup", at: 0)
// shoppingList now contains 7 items
// "Maple Syrup" is now the first item in the list

同样,使用remove(at :)方法从数组中删除一个项目。 此方法将删除指定索引处的项目,并返回已移除的项目(虽然如果不需要,您可以忽略返回的值):

let mapleSyrup = shoppingList.remove(at: 0)
// the item that was at index 0 has just been removed
// shoppingList now contains 6 items, and no Maple Syrup
// the mapleSyrup constant is now equal to the removed "Maple Syrup" string

注意:如果尝试访问或修改超出数组现有边界的索引的值,则会触发运行时错误。 您可以通过将索引与数组的count属性进行比较来检查索引是否有效。 除非计数为0(意味着数组为空),数组中最大的有效索引将始终为count - 1,因为数组从零开始索引。
在删除元素时,数组中的任何间隙都将关闭,因此索引0处的值再次等于 "Six eggs":

firstItem = shoppingList[0]
// firstItem is now equal to "Six eggs"

如果要从数组中删除最后一个项目,请使用removeLast()方法,而不是remove(at :)方法,以避免查询数组的count属性。 像remove(at :)方法,removeLast()返回删除的项:

let apples = shoppingList.removeLast()
// the last item in the array has just been removed
// shoppingList now contains 5 items, and no apples
// the apples constant is now equal to the removed "Apples" string

遍历数组

您可以使用for-in循环遍历数组中的整组值:

for item in shoppingList {
    print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas

如果您需要每个项目的整数索引及其值,请使用enumerated()方法对数组进行迭代。 对于数组中的每个项,enumerated()方法返回一个由整数和项组成的元组。 整数从零开始,每个项目向上计数一次; 如果枚举整个数组,这些整数匹配项目的索引。 您可以将元组分解为临时常量或变量作为迭代的一部分:

for (index, value) in shoppingList.enumerated() {
    print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容