iOS开发之Swift篇(4)—— 集合类型Array/Set/Dictionary

目录

  • 版本
  • 简介
  • Array
  • Set
  • Dictionary

版本

Xcode 11.0
Swift 5.1

简介

1. 简介
Swift三种基本集合类型:
数组(Array): 使用有序列表存储同一类型的多个值, 相同的值可以出现在不同位置中.
集合(Set): 存储相同类型并且没有确定顺序的值, 每个元素只出现一次.
字典(Dictionary): 使用无序的键值对存储相同类型的键和相同类型的值, 每个值(value)都关联唯一的键(key).

集合类型.png

Swift 中的数组、集合和字典必须明确其中保存的键和值类型,这样就可以避免插入一个错误数据类型的值。同理,对于获取到的值你也可以放心,其数据类型是确定的。

2. 可变性
不同于OC中的NSMutableArray/NSMutableDic/NSMutableSet, Swift中的集合类型使用let标识符则为不可变的(常量), 使用var修饰则为可变的(变量).

3. 语法
数组的完整写法为 Array<Element>,其中 Element 是这个数组中唯一允许存在的数据类型。也可以使用像 [Element] 这样的简单语法。
集合的完整写法为 Set<Element>,这里的 Element 表示集合中允许存储的类型。和数组不同的是,集合没有等价的简化形式。
字典的完整写法为 Dictionary<Key, Value> ,其中 Key 是一种可以在字典中被用作键的类型,Value 是字典中对应于这些键所存储值的数据类型。你也可以用 [Key: Value] 这样简化的形式去表示字典类型。

类型推断
在第二章节基础部分中我们提到, Swift是具有类型推断机制的. 编译器可以在编译代码的时候自动推断出表达式的类型。原理很简单,只要检查你赋的值即可。
比如

var arr4 = ["one", "two"]
// arr4会被推断为[String]类型

Array

1. 创建

// 1. 创建空数组
var arr1 = [Int]()
// 2. 创建带有默认值数组
var arr2 = Array(repeating: 6, count: 3)
// 3. 通过两个数组相加创建一个数组
var arr3 = arr1 + arr2
// 4. 用数组字面量构造数组
//var arr4: [String] = ["one", "two"]
var arr4 = ["one", "two"]

/*
[]
[6, 6, 6]
[6, 6, 6]
["one", "two"]
*/

2. 访问和修改

var arr5 = [1, 2, 3]

// 查询数量
print(arr5.count)
// 3

// 判断为空
print(arr5.isEmpty)
// false

// 查询是否存在某元素
print(arr5.contains(2))
// true

// 后尾添加
arr5.append(4)
print(arr5)
// [1, 2, 3, 4]

// 后尾批量添加
arr5 += [5, 6]
print(arr5)
// [1, 2, 3, 4, 5, 6]

// 访问对应下标元素
print(arr5[2])
// 3

// 修改对应下标元素
arr5[0] = 88
print(arr5)
// [88, 2, 3, 4, 5, 6]

// 批量修改连续下标元素, 即使新数据与原数据数量不一致
arr5[1...4] = [88, 88]
print(arr5)
// [88, 88, 88, 6]

// 插入一个元素
arr5.insert(66, at: 3)
print(arr5)
[88, 88, 88, 66, 6]

// 移除一个元素
arr5.removeLast()
print(arr5)
// [88, 88, 88, 66]
arr5.remove(at: 3)
print(arr5)
// [88, 88, 88]

3. 遍历

var arr6 = ["one", "two", "three", "four", "five"]

// 遍历值
for value in arr6 {
    print(value)
}

/*
one
two
three
four
five
*/

// 遍历索引和对应的值
for (index, value) in arr6.enumerated() {
    print("index:\(index) value:\(value)")
}

/*
index:0 value:one
index:1 value:two
index:2 value:three
index:3 value:four
index:4 value:five
*/

Set

1. 创建

// 1. 创建空集合
var sets1 = Set<String>()
// 2. 用数组字面量构造集合
var sets2: Set<Int> = [11, 22, 33, 44, 55]

/*
[]
[55, 11, 33, 44, 22]
*/

注意: 一个集合类型不能从数组字面量中被直接推断出来,因此 Set 类型必须显式声明。

2. 访问和修改
与数组操作大同小异.

3. 遍历
因为集合Set是无序的, 所以遍历出的结果也是无序的. 如果想要值按照一个特定的顺序遍历出来, 可以使用 sorted() 方法.

var sets3: Set<String> = ["a", "b", "c", "d", "e"]

// 无序遍历
for value in sets3 {
    print(value)
}
/*
 e
 c
 d
 b
 a
 */

// 有序遍历
for value in sets3.sorted() {
    print(value)
}
/*
 a
 b
 c
 d
 e
 */

4. 基本集合操作
下面的插图描述了两个集合 a 和 b,以及通过阴影部分的区域显示集合各种操作的结果。

基本几何操作.png

  • 使用 intersection(_:) 方法根据两个集合的交集创建一个新的集合。
  • 使用 symmetricDifference(_:) 方法根据两个集合不相交的值创建一个新的集合。
  • 使用 union(_:) 方法根据两个集合的所有值创建一个新的集合。
  • 使用 subtracting(_:) 方法根据不在另一个集合中的值创建一个新的集合。

Dictionary

1. 创建

// 1. 创建空字典
var dic1 = [String: Int]()
// 2. 用字典字面量创建字典
//var dic2: [String: Int] = ["one": 1, "two": 2, "three": 3]
var dic2 = ["one": 1, "two": 2, "three": 3]

/*
[:]
["two": 2, "one": 1, "three": 3]
*/

2. 访问和修改

var dic3 = [1: "一", 2: "二", 3: "三"]

// 访问某个下标对应值
// 因为有可能请求的键没有对应的值存在,字典的下标访问会返回对应值类型的可选类型。
if let value = dic3[3] {
    print(value)
}else {
    print("empty")
}

// 添加键值对
dic3[4] = "四"
print(dic3)
// [3: "三", 1: "一", 2: "二", 4: "四"]

// 修改键值对 (法1)
dic3[2] = "二二"
print(dic3)
// [3: "三", 1: "一", 2: "二二", 4: "四"]

// 修改键值对 (法2)
dic3.updateValue("二二二", forKey: 2)
print(dic3)
// [3: "三", 1: "一", 2: "二二二", 4: "四"]

// 移除键值对 (法1)
dic3[4] = nil
print(dic3)
// [3: "三", 2: "二二二", 1: "一"]

// 移除键值对 (法2)
dic3.removeValue(forKey: 2)
print(dic3)
// [3: "三", 1: "一"]

注意: 上面的方法2与下标语法不同的是, updateValue(_:forKey:) 这个方法返回更新值之前的原值, 这样使得你可以检查更新是否成功; removeValue(forKey:) 这个方法返回被移除的值或者在没有对应值的情况下返回 nil.

遍历

var dic4 = [1: "one", 2: "two", 3: "three", 4: "four", 5: "five"]

// 遍历键 (无序)
for key in dic4.keys {
    print("key: \(key)")
}
/*
 key: 3
 key: 4
 key: 5
 key: 1
 key: 2
 */

// 遍历键 (有序)
for key in dic4.keys.sorted() {
    print("key: \(key)")
}
/*
 key: 1
 key: 2
 key: 3
 key: 4
 key: 5
 */

// 遍历值 (无序)
for value in dic4.values {
    print("value: \(value)")
}
/*
 value: three
 value: four
 value: five
 value: one
 value: two
 */

// 遍历值 (有序)
for value in dic4.values.sorted() {
    print("value: \(value)")
}
/*
 按字符逐个排序
 value: five
 value: four
 value: one
 value: three
 value: two
 */

// 遍历键和值
for (key, value) in dic4 {
    print("key:\(key) value:\(value)")
}
/*
 key:3 value:three
 key:4 value:four
 key:5 value:five
 key:1 value:one
 key:2 value:two
 */
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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