Swift集合类型-数组

从Swift3开始写项目,将学到的知识点记录下来,作为笔记方便以后查阅与复习。

可变性

let numbers = [1, 2, 3, 4, 5]

如果使用append(_:) 这样的方法来修改上面定义的数组的话,会得到一个编译错误。这是因为在上面的代码中数组是用 let 声明为常量的,要让数组具有可变性,我们应该使用var来定义数组。

var numbers = [1, 2, 3, 4, 5]
numbers.append(8)
numbers.append(contentsOf: [13, 21])
numbers // [1, 2, 3, 4, 5, 8, 13, 21]

let定义的变量具有不可变性,应该被优先使用,不过仅仅只是针对值语义类型。用let定义的引用类型,只保证这个引用不可变,引用指向的对象可以改变的,而Swift的数组属于值语义类型,后续写结构体再做详细介绍。

迭代

实际上Swift不建议开发者去手动操作索引,这样往往可能带来很多潜在的bug。所以从Swift3开始,传统C语言风格的循环被移除了

  • for element in array // 基础迭代
  • for element in array.dropFirst() // 迭代除了第一个元素之外数组的其他部分
  • for element in array.dropLast(2) // 迭代除了最后两个元素之外数组的其他部分
  • for (index, element) in collection.enumerated() // 列举数组中对应的元素与下标
  • 获取元素的索引,array.index系列函数
  • array.forEach {element in print(element)}
    forEach与第一个 for in循环区别不大。有个注意点就是当for循环中有return语句时,forEach中的return不能返回到外部函数的作用域,只能返回到闭包本身之外,例如:
let numbers = [1, 2, 3, 4, 5]
numbers.forEach { number in
  debugPrint(number)
  if number > 2 {return}
}

这段代码会输出全部的数字,return语句不会终止循环

高阶函数

  • Map

Swift数组的map方法出自函数式编程,它会对数组的每一个元素变形,然后返回一个新的数组。例如将一个数组的所有元素平方,然后返回一个新的数组:

let numbers = [1, 2, 3, 4, 5]
let numMap = numbers.map {num in num * num}

// 还有更简便的写法
let numMap = numbers.map {$0 * $0}
  • Filter

filter方法会遍历数组,将符合条件的元素过滤出来,放入新的数组并返回。

let numbers = [1, 2, 3, 4, 5]
let numFilter = numbers.filter {num in num % 2 == 0}

// 简写
let numFilter = numbers.filter {$0 % 2 == 0}
  • Reduce

reduce方法可以把所有的元素合并处理,返回一个新的值,例如返回数组所有元素的和:

let numbers = [1, 2, 3, 4, 5]
let numReduce = numbers.reduce(0) { result, num in
            return result + num
        }

// Swift中运算符也是函数,因此可以简写
let numReduce = numbers.reduce(0, +)

// 还可以对数组的元素做其他的操作,返回不同类型的值,例如字符串
// ...
  • FlatMap

flatMap方法一般用来进行复合数组的展平操作,这里不多做介绍了。

总结:可通过组合使用map与filter实现一些功能,感兴趣的可以去查找map、filter、reduce底层实现的相关资料。map与filter其实也可以用reduce来实现。

Swift标准库中,还有很多类似接收一个函数,将这个函数作为逻辑代码的方法,例如:

  • sort、lexicographicCompare、partition: 对元素进行排序
  • index、first、contains: 符合某个特定条件
  • min、max: 最小与最大值
  • elementsEqual: 元素是否相等
  • prefix
  • drop

切片

Swift的数组可根据索引范围来获取数组的范围,例如:

let numbers = [1, 2, 3, 4, 5]
let slice1 = numbers[2...]
let slice2 = numbers[...3]

上面的slice1与slice2类型为ArraySlice<Int>,不是Array。切片的数据共享原数组的数据共享原数组的内存,不需要额外的复制开销,方法都是跟Array一样的。将切片转为普通数组let arr = Array(slice1)

可选值注意点

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

推荐阅读更多精彩内容