4.集合
Swift 语言提供Arrays、Sets和Dictionaries三种基本的集合类型用来存储集合数据。数组(Arrays)是有序数据的集合。集合(Sets)是无序无重复数据的集合。字典(Dictionaries)是无序的键值对的集合。
如果创建一个Arrays、Sets或Dictionaries并且把它分配成一个变量,这个集合将会是可变的。这意味着我们可以在创建之后添加更多或移除已存在的数据项,或者改变集合中的数据项。如果我们把Arrays、Sets或Dictionaries分配成常量,那么它就是不可变的,它的大小和内容都不能被改变。可变和不可变对应OC中的NSArray、NSMutableArray等。
1.数组
- 数组使用有序列表存储同一类型的多个值。相同的值可以多次出现在一个数组的不同位置中。
- 写 Swift 数组应该遵循像Array<Element>这样的形式,其中Element是这个数组中唯一允许存在的数据类型。我们也可以使用像[Element]这样的简单语法。尽管两种形式在功能上是一样的,但是推荐较短的那种。
//数组初始化 var listTwo = Array<Int>(); //遵循语法方式:空数组 var listOne = [Int](); //简单语法方式:空数组 var listThree: [Int] = [1, 2, 3]; //字面量数组 var listFour = [Double](count: 3, repeatedValue: 0.0); //带默认值数组 var listFive = [Double](count: 4, repeatedValue: 1.0); var listSix = listFour + listFive; //数组相加创建数组 print("The listFive contains \(listFive.count) items."); //只读属性count来获取数组中的数据项数量 listOne.isEmpty; //布尔值属性isEmpty检查count属性的值是否为 0 //添加元素 listOne.append(3); listTwo += [4]; listThree.insert(0, atIndex: 0); //获取数据元素 var firstItem = listFive[0]; //删除元素 listSix.removeAtIndex(0); //listSix.removeLast(); //listSix.removeAll(); //数组遍历 for item in listSix { print(item); } for (index, value) in listSix.enumerate() //使用enumerate()方法获取每个数据项的值和索引值 { print("Item \(String(index + 1)): \(value)"); }
2.集合
- 用来存储相同类型并且没有确定顺序的值。当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组。
- Swift 中的Set类型被写为Set<Element>,这里的Element表示Set中允许存储的类型,和数组不同的是,集合没有等价的简化形式。
//集合初始化 var listOne = Set<Int>(); //构造器语法 var listTwo: Set<Int> = [1, 2, 3, 5, 9, 10, 13, 7, 6, 8]; //数组字面量创建集合 var listThree: Set = [2, 3, 4]; //Set类型不能从数组字面量中被单独推断出来,因此Set类型必须显式声明 print("The listOne contains \(listOne.count) items."); //只读属性count来获取集合中的数据项数量 listOne.isEmpty; //布尔值属性isEmpty检查count属性的值是否为 0 //添加元素 listTwo.insert(4); //删除元素 listTwo.remove(3); //判断是否包含特定值 listTwo.contains(5); //遍历 for item in listTwo { print(item); } for item in listTwo.sort() //排序 { print("$$$$\(item)"); } for (index, value) in listTwo.enumerate() //使用enumerate()方法获取每个数据项的值和索引值 { print("Item \(String(index + 1)): \(value)"); } listTwo.sort(); //[1, 2, 4, 5, 6, 7, 8, 9, 10, 13] listThree.sort(); //[2, 3, 4] //根据两个集合的值创建一个新的集合 listTwo.union(listThree).sort(); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13] //根据两个集合中都包含的值创建的一个新的集合 listTwo.intersect(listThree).sort(); //[2, 4] //根据不在该集合中的值创建一个新的集合 listTwo.subtract(listThree).sort(); //[1, 5, 6, 7, 8, 9, 10, 13] //根据在一个集合中但不在两个集合中的值创建一个新的集合 listTwo.exclusiveOr(listThree).sort(); //[1, 3, 5, 6, 7, 8, 9, 10, 13]
集合操作图解:
3.字典
- 存储多个相同类型的值的容器。每个值(value)都关联唯一的键(key),键作为字典中的这个值数据的标识符。和数组中的数据项不同,字典中的数据项并没有具体顺序。
- Swift 的字典使用Dictionary<Key, Value>定义,其中Key是字典中键的数据类型,Value是字典中对应于这些键所存储值的数据类型。也可以用[Key: Value]这样快捷的形式去创建一个字典类型。虽然这两种形式功能上相同,但是后者是首选。
//字典初始化 var dicTwo = Dictionary<Int, String>(); //标准语法方式 var dicOne = [Int: String](); //快捷语法方式 var dicThree : [String: String] = ["Gof": "Ligaofeng", "Dub": "Dublin"]; //字面量创建字典 var dicFour = ["Gof": "Ligaofeng", "Dub": "Dublin", "YYZ": "Toronto Pearson"]; print("The dicThree contains \(dicThree.count) items."); //只读属性count来获取字典中的数据项数量 dicThree.isEmpty; //布尔值属性isEmpty检查count属性的值是否为 0 //获取/修改数据元素 var item = dicFour["Gof"]; dicFour["Chief"] = "Chief GO"; let oldValue = dicFour.updateValue("LiGaoFeng", forKey: "Gof"); let delValue = dicFour.removeValueForKey("Gof"); //遍历 for (key, value) in dicFour { print("\(key): \(value)"); } for key in dicThree.keys { print("Key: \(dicThree)"); } for value in dicThree.values { print("Value: \(value)"); }
无善无恶心之体,
有善有恶意之动,
知善知恶是良知,
为善去恶是格物。