Swift4的翻译

集合类型

Swift提供三种集合类型, 分别为arrays, sets, and dictionaries, 他们都是存储型数据类型, Arrays存储有序数据的集合, Sets存储无序的但有唯一数值的集合, Dictionaries是无序的key-value(键值对)的组合

Array Set Dictionary

我们在存储数据的时候应该非常清楚Arrays sets dictionaries他们可以存储什么类型的数据, 这意味着你无法讲一个错误数据类型的数据插入到集合中, 也就是你准确的从集合中取出相应类型的数据

Note:
Swift的array, set, and dictionary是通用的集合类型, 了解泛型集合,请看

1: 集合的可变性

如果你创建一个array, dictionary, set并且赋值给一个变量, 这个组合就是一个可变的。你可以增删改这个集合, 如果你创建一个array, dictionary, set并且赋值给一个常量, 这个集合的大小内容都不可以修改.

Note:
确认一个集合是不需要修改的, 此时创建一个不可变的集合是非常棒的, 这样做有利于你理解代码并有利于Swift编译器优化你的集合性能

2: Arrays

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

Note:
Swift的Array可以桥接到Foundation框架的NSArray类, 想要了解更多Foundation and Cocoa下Array的使用, 请看Using Swift with Cocoa and Objective-C (Swift 4)Working with Cocoa Data Types

2.1: 数组类型的速记语法

Swift数组的类型全部想 Array<Element>, 当Element的类型是数组接受的才可以保存, 你也可以简写[Element], 虽然这两种形式在功能上是相同的,但是简写形式更值得推崇,并且本指南中使用引用数组都是使用简写形式

2.2: 创建一个空的数组

初始化定义一个空数组

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]
2.3: 创建具有默认值的数组

Swift的数组提供了创建特定大小特定数值的初始化方法, 您将该初始化方法传递为适当类型(称为repeat)的默认值:和新数组默认值的数量(称为count):

var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
2.4: 两个数组拼接初始化一个数组

您可以通过使用加法运算符(+)将两个具有兼容类型的现有数组相加在一起来创建一个新数组。新数组的类型根据您添加两个数组的类型推断:

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]
2.5: 数组文字初始化数组

您还可以使用数组文字初始化数组,这是将一个或多个值作为数组集合写入的简写方式。数组文字被写成一个值列表,用逗号分隔,用一对方括号包围:

[value 1, value 2, value 3]

下面的示例创建一个名为shoppingList的数组来存储String值:

var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList has been initialized with two initial items

shoppingList变量被声明为“字符串值的数组”,写成[String]。 因为这个特定的数组指定了一个值类型的String,所以只允许存储String值。 在这里,使用两个字符串值(“Eggs”和“Milk”)初始化shoppingList数组,写入数组文字。

Note
这个shoppingList数组被定义为一个变量而不是常量, 因为在下面的示例中还要添加更多的元素

在这种情况下,数组字面值包含两个String值,没有其他值。 这匹配了shoppingList变量的声明类型(一个只能包含String值的数组),因此允许使用数组文字的赋值作为初始化shoppingList的两个初始项。

因为有Swift的类型自动推断,如果您使用包含相同类型值的数组文字来初始化数组,则不必编写该数组的类型。 shoppingList的初始化可以以简约的格式写成:

var shoppingList = ["Eggs", "Milk"]

因为数组文字中的所有值都是相同的类型,所以Swift可以推到出[String]并用于shoppingList变量的正确类型。

2.6: 操作和修改数组

你可以操作和修改数组通过方法、属性甚至下标

查找数组的数量, 可以用只读属性的count

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

或者,使用加法赋值运算符(+=)附加一个或多个兼容项目的元素:

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"

数组中的第一个项目的索引为0,而不是1. Swift中的数组始终为零开始

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

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

当您使用下标语法时,您指定的索引必须是有效的。例如,写入shoppingList [shoppingList.count] =“Salt以尝试将一个项目附加到数组的末尾导致运行时错误。

您也可以使用下标语法来一次性更改值范围,即使替换值的值与要替换的范围的长度不同。 以下示例用“香蕉”和“苹果”替代“巧克力蔓延”,“奶酪”和“黄油”:

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

insert(_:at:)方法的调用将在购物清单开始处插入一个值为“Maple Syrup”的新项,由索引为0表示。

同样,您可以使用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

Note:
如果您尝试访问或修改不在数组现有边界之外的索引的值,则会触发运行时错误。 您可以通过将索引与数组的count属性进行比较来检查索引是否有效。 数组中最大的有效索引是count-1,因为数组从零开始索引 - 但是,当count为0(表示数组为空)时,没有有效的索引。

删除项目时,数组中的任何间隙都会关闭,因此索引号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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 53.计算字符 在字符串中获取字符值的数量, 可以使用字符串字符属性中的计数属性: let unusualMena...
    无沣阅读 1,091评论 0 4
  • //var intArray:Array = [Int]();varintArray = [Int]();prin...
    XLsn0w阅读 436评论 0 0
  • 1 .数组 Arrays 数组使用有序列表存储同一类型的多个值。相同的值可以多次出现在一个数组的不同位置中。这和O...
    iceMaple阅读 465评论 0 1
  • 大学毕业于一个二本院校,统计学专业,自己感觉毕业后不知道做什么工作,也是不想工作,就在大三那年跟着同学一起考研,后...
    MUSE_0c58阅读 209评论 0 0
  • 忘了从什么时候开始想要回忆一些事情时却总也想不起来,所以用文字记录下这段心情。 Part 1 来海南是一个即兴的决...
    期盖格尔阅读 463评论 1 2