持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
在本章中,你将学会数组、集合和字典三种集合类型的常见使用方法。
前言
和Apple
官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift
语言的一些概念和用法,方便大家更好地学习和掌握Swift
语言。
这同时也是对自己学习Swift
语言过程的知识整理。
如有错误,以你为准。
我们新建一个PlayGround
文件,命名为SwiftTypeSet
。
数组的创建
数组,是一堆数据有序排列的集合。
和字符串使用的方法类型,我们可以用数据的字面量来构建数组,我们常用var
来声明“[ ]
”数组。示例:
//数组的创建 var sampleModels1: NSArray = [] //空数组 var sampleModels2 = [String]() //指定值类型的空数组 var sampleModels3 = ["前端" , "后端", "安卓", "iOS" ] //有默认值的数组 var sampleModels4 : [String] = ["前端" , "后端", "安卓", "iOS"] //指定类型且有默认值的数组
这里科普一些知识点。
如果我们要定义一个空数组,那么我们直接“var sampleModels1 = [ ]
”是不行的,在Swift
语言中,空集合需要显示类型
,而直接声明空集合会因为隐形转换
而报错,因此需要定义空集合的类型为NSArray
类型。
至于数组的可变性和连接方式,和字符串的使用大同小异。
由于数组是使用var
声明的数组变量,因此在后面的代码中,我们可以更新数组中的数据,而let
声明的常量数组固定了就不能更改数据了,因此数组的创建基本都是用var
声明的。
数组的使用
另外,数组的运算符、函数的使用和字符串的使用方式基本一致,示例:
//数组的使用 sampleModels4.count //获得数组中的数量 sampleModels4.isEmpty //判断数组是否为空 sampleModels4[0] //获得数组中的第一个数据 sampleModels4.append("文如秋雨") //在数组最后添加一个字符串 sampleModels4.insert("文如秋雨", at: 0) //在数组的第一个索引位置插入一个字符串 sampleModels4.remove(at: 0) //移除数组中索引第一个位置中的数据 sampleModels4.removeLast() //移除数组中的最后一个数据
数组的遍历
在Swift
开发过程中,常常会定义好示例的数组数据,然后通过ForEach
循环遍历数据展示在List
列表上。示例:
//数组的遍历 struct ContentView: View { // 定义数组,存放数据 var appleSymbols = ["house.circle", "person.circle", "bag.circle", "location.circle", "bookmark.circle", "gift.circle", "globe.asia.australia.fill", "lock.circle", "pencil.circle", "link.circle"] var body: some View { // 列表遍历数组数据 List { ForEach(appleSymbols.indices, id: \.self) { index in Image(systemName: self.appleSymbols[index]) .resizable() .foregroundColor(.gray) .frame(width: 25, height: 25) } } } }
首先,我们使用 var
声明了一个字符串类型的数组变量appleSymbols
,数组可以根据其内部元素而自动辨别其类型。
然后,我们使用了List
列表和ForEach
循环的方法遍历appleSymbols
数组中的数据,在ForEach
循环方法中,我们用.indices
获得数据的范围,appleSymbols.indices
等同于0..appleSymbols.count
。
最后,我们使用appleSymbols[index]
索引数组中每一个元素,循环这个过程,就在List
列表中ForEach
循环遍历出了appleSymbols
数组中的数据。
预览效果如下:
集合的创建
集合,是一堆数据无序排列
的集合。
集合和数组概念和使用方法类型,数组是有序的集合,而集合本身是无序的数据的集合。示例:
//集合的创建 var exampleModels1 = Set<Character>() //空数组 var exampleModels2: Set<String> = [ ] //指定值类型的空数组 var exampleModels3: Set = ["前端工程师" , "后端工程师", "安卓工程师", "iOS工程师"] var exampleModels4: Set = ["前端" , "后端", "安卓", "iOS"] //指定类型且有默认值的数组
上述代码中,集合和数组一样,也能根据字面量的数据,自动判断其类型。
集合的使用
集合的使用方法和数组基本类似,因为数组本就是有序排列的集合,但集合由于是无序的,因此使用点也有些不同,集合常见的使用方法如下:
//集合的使用 exampleModels3.count //获得集合中的数量 exampleModels3.isEmpty //判断集合是否为空 exampleModels3.insert("文如秋雨") //在集合中插入一个字符串 exampleModels3.remove("文如秋雨") //在集合中指定删除某个字符串 exampleModels3.contains("文如秋雨") //检查集合中是否包括某个特定值
上述代码中,我们可以看到insert
添加元素的方法,由于集合是无序
的,因此不需要指定
索引位置。
同样remove
删除的方法,由于集合是无序的,删除需要指定某个特定值
。
集合的操作
在高中还是大学的时候,我们也学习过集合的相关操作:交集、不相交、并集、相对补集、子集。
集合中的操作和和数学逻辑上的集合运算基本类似,也有交集、不相交、并集、相对补集、子集几种运算方式。示例:
//集合的操作 exampleModels3.intersection(exampleModels4).sorted() //交集 exampleModels3.symmetricDifference(exampleModels4).sorted() //不相交 exampleModels3.union(exampleModels4).sorted() //并集 exampleModels3.subtracting(exampleModels4).sorted() //相对补集 exampleModels3.isSubset(of: exampleModels4) //判断exampleModels1数组中的所有值是否在exampleModels2数组里 exampleModels3.isSuperset(of: exampleModels4) //判断exampleModels1数组中的所有值是否在exampleModels2数组里,和上面是一个原理 exampleModels3.isDisjoint(with: exampleModels4) //判断两个数组有没有交集 复制代码
上述代码中,我们使用数学逻辑完成了两个集合之间的交互。这里还使用到了一个概念,sorted排序。
当我们进行两个集合的运算后,集合内若没有参数
时默认为升序
排序。
isSubset
子集、isSuperset
超集都是为了判断A集合是否是B集合的子集,即A集合中所有元素是不是被B集合包含。
字典的创建
字典,也是一种无序的集合。和集合不同,它的字面量是以键值对的形式,表示方式和数组类似,使用“[ 键 : 值 ]
”的形式。示例:
//字典的创建 var dictionaries: [Int: String] = [:] //指定类型的空字典 var person1 = ["文如秋雨": "产品经理"] //有默认值的字典 var person2: [String: Int] = ["文如秋雨": 26] //指定类型且有默认值的字典
Person1的情况和数组一样,如果字典的键值对是一种类型,那么系统会自动判断这个字典的类型。
字典的使用
字典的使用,也和数组、集合方式类似,但也有一些不同,我们用一些例子来讲解:
//字典的使用 person1.count //获得字典数据项的数量 person1.isEmpty //判断字典数据项是否为空 person1["文如秋雨"] //索引字典中特定的键 person1["文如秋雨"] = "产品经理" //字典会根据键值对判断键是否存在,如果不存在,则添加新的键值对到字典里,如果存在,则更新键的值 person1.updateValue("高级产品经理", forKey: "文如秋雨") //更新forKey指定的键对应的值 person1["文如秋雨"] = nil //移除字典中指定的键值对 person1.removeValue(forKey:"文如秋雨") //移除字典中指定的键值对
在学习数组、集合、字典时,我们会发现很多方法基本类似,这时候其实我们只需要记忆不同的部分,而这部分也恰恰是面试时考验面试者对于Swift
语言掌握程度的判断。
字典转化为数组
最后,我们来了解下字典如何转化为数组。
我们可以发现字典和数组的区别,除了有序和无序外,字典有键和值,而数组可以说只有值。
如果我们要将字典转化为数据,那么只需要把字典中的值的部分提取出来,就可以变成数组了。
//字典转化为数组 var person3 = ["文如秋雨": "产品经理" ,"文如秋雨": "iOS开发者"] let dictValues = [String](person3.values) //dictValues = ["产品经理", "iOS开发者"]
上述代码中,dictValues
最后的结果就是一个数组。
以上就是本章的全部内容。
快来动手试试吧!