Swift文档Chapter 4 集合类型

Swift提供了3种基本的集合类型:

  • Arrays:有序数据的集;
  • Sets:无序无重复数据的集;
  • Dictionaries:无序键值对的集。

以上类型都被实现为泛型集合。

集合的可变性

以上类型分配为变量,这个集合就是可变的。我们可以添加或者移除存在的数据项。如果分配成常量,那就是不可变的,大小和内容都不可以改变。

数组(Arrays)

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

数组的定义

数组的定义包含两种方式:

  • Array[Element]定义;
  • [Element]定义。

本文推荐使用第二种方式定义,以下是一个整数数组的定义:

var someInts = [Int]()

如果说代码上下文提供了类型信息,例如函数参数或者已经定义好了类型的变量或者常量,我们可以直接使用[]创建空数组:

someInts.append(3)
someInts = []

创建一个带默认值的数组

可以使用repeating参数传入初始值,count参数传入数组大小:

var threeDoubles = Array(repeating: 0.0, count: 3)
//这是一个[Double]数组,等价于[0.0, 0.0, 0.0]

在数组中使用+

两个相同类型的数组使用+会直接连接起来,得到新数组类型会直接推断出来,不需要声明。

用数组字面量构造数组

数组的字面量是一系列由逗号分隔并由方括号包裹着的值:[value1, value2, value3]

访问和修改数组

  • count:获取数组元素的数量;
  • isEmpty:判断count是否为0的缩写形式;
  • append(_:):在数组后添加新的数据项;
  • +=:可以直接合并两个数组;
  • [index]:数组由下标直接访问,从0开始计数,也可以改变已有索引值的值。也可以使用一个范围改变数组内数组,即使新数据和原有数据个数不一样(直接顶替);
  • insert(_:at:):在某个索引值之前加入数据;
  • remove(at:):移除这个索引值的数据并返回这个数据;
  • removeLast():直接移除数组最后一项,避免索引。

数组的遍历

可以使用for-in直接遍历数组。如果需要每一个数据项以及索引值,那么可以使用enumerated()方法(这是一个属性)。会返回一个由索引值和数据值构成的元组。

集合(Sets)

**集合(Sets)**存储相同类型并且没有确定顺序的值。当元素顺序不重要并且每个元素只出现一次使用集合而不是数组。

集合类型的哈希值

存储在集合类型的值必须书可哈希化的。必须可以提供一个方法计算他的哈希值。哈希值为Int类型,相等类型哈希值相同:如果a==b那么a.hashValue==b.hashValue
Swift所有的基本类型都是可哈希化的。

集合类型语法

集合的生命方式是Set<Element>。集合没有对应的简化形式。
使用构造器构造一个空集合的方式是:

var letters = Set<Character>()

如果可以通过上下文推断集合类型,那么可以直接使用[]声明一个空集合类型。

使用数组字面量创建集合

数组字面量可以创建集合,当声明为集合类型时,可以直接使用数组字面量赋初值。
Set类型不能够直接推断出来,必须显式的声明类型。

访问和修改一个集合

  • count:获取集合元素的数量;
  • isEmpty:判断count是否为0的缩写形式;
  • insert(_:):在集合中添加新的数据项;
  • remove(_:):删除集合中一个元素,如果包含这个元素就返回这个元素,如果不包含就返回nil
  • removeAll(_:):删除集合中所有元素;
  • contains(_:):检查集合中是否包含这个值。

遍历一个集合

可以使用for-in进行遍历。但是集合没有顺序,如果要按照顺序访问,需要使用sorted()方法返回一个有序数组,这个数组的顺序是按照<的比较顺序。

集合操作

集合可以实现基本的集合操作。
Swift文档Chapter 4 集合类型

  • intersection(_:):计算两个集合的交集;
  • symmetricDifference(_:):计算两个集合的对等茶分集;
  • union(_:):计算两个集合的并集;
  • subtracting(_:):计算两个集合的差集。

集合成员的关系和相等

  • ==:两个集合的元素是否元素完全相等;
  • isSubset(of:):判断一个集合是否是另一个集合的子集;
  • isSuperset(of:):判断一个集合是否是另一个集合的父集;
  • isStrictSubset(of:):判断一个集合是否是另一个集合的严格子集(两个集合不可以相等);
  • isStrictSuperset(of:):判断一个集合是否是另一个集合的严格父集(两个集合不可以相等);
  • isDisjoint(with:):判断两个集合是否不含有相同的值(是否没有交集)。

字典(Dictionaries)

**字典(Dictionaries)**是一个存储多个相同类型值的容器。每一个值(value)都有对应的键值(key)。我们通过键值访问对应的数据。

字典类型创建

字典类型有两种创建方法:

  • 使用Dictionary<Key, Value>
  • 使用[Key: Value]
    本文主要使用第二种方式。如果上下文可以推断出字典的类型,可以直接使用[:]创建一个空字典。

字典类型的字面量

字典类型字面量是由一对一对被逗号分隔,被方括号包裹的键值对。键值对是由键值(key)和数据(value)组成的,[key1: value1, key2: value2, key3: value3]。字典类型可以进行推断。

访问和修改字典

  • count:获取字典元素的数量;
  • isEmpty:判断count是否为0的缩写形式;
  • [key]:下标访问获得对应的数值,也可以进行修改,如果不存在对应值,那么返回nil,字典返回的是一个可选值,需要解包使用。如果给一个键赋值为nil,那么这个键对应的值将会删除;
  • updateValue(_:forKey:):更新键值对应的数据,如果这个值不存在,会加入新值或者更新原有值并返回旧值。返回类型是可选类型,如果不存在旧值,那么返回nil
  • removeValue(forKey:):移除对应键值和数据,如果不存在旧值,返回nil,否则返回旧值。

字典的遍历

可以使用for-in遍历字典,返回值是元组,包含键值和数据。可以使用keys属性和values属性获得字典的键值和数据。并且可以使用类型转换转换成数组类型。两个属性也可以使用sorted()方法获得排序后的数组。

 

上一篇:机器学习 - 多元回归


下一篇:GraphQL:来来来,Union