Swift4-集合类型

集合类型(Collection Types)

集合的可变性、数组、集合、集合操作、字典。

Swift语言提供Arrays、Sets和Dictionaries。三种基本的集合类型用来存储集合数据。

数组Arrays是有序数据的集。集合(Sets)是无序重复数据的集。字典(Dictionaries)是无序的键值对的集。

Swift语言中的Arrays、Sets和Dictionaries中存储的数据值类型必须明确。这意味着我们不能把不正确的数据类型插入其中。

集合的可变性:

如果创建一个Arrays、Sets或Dictionaries并且把它分配成一个变量,这个集合将会是可变的。这意味着我们可以在创建之后添加更多或移除已存在的数据项,或者改变集合中的数据项。如果把Arrays、Sets或Dictionaries分配成常量,那么它就是不可变的,大小和内容都不能被改变。

数组Arrays:

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

数组的简单语法:

写Swift数组应该遵循像Array<Element>这样的形式,其中Element是这个数组中唯一允许存在的数据类型。也可以使用像[Element]这样的语法。

创建一个空数组:

var a=[Int]()

创建一个带有默认值的数组:

Swift中的Array类型还提供一个可以创建特定大小并且所有数据都被默认的构造方法。可以把准备加入新数组的数据项数量(count)和适当类型的初始值(repeating)传入数组构造函数。

var a=Array(repeating: 1.3, count: 3)

通过两个数组相加创建一个数组:

可以使用加法操作符(+)来组合两种已存在的相同类型数组。新数组的数据类型会被从两个数组的数据类型中推断出来:

var b=Array(repeating:5.2, count: 5)

var c=a+b

用数组字面量构造数组:

可以使用数组字面量来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。数组字面量是一系列由逗号分隔并由方括号包含的数值:

var d=[1,2,3,]

var e:String=["cjj","xyy"]

访问和修改数组:

可以通过数组的方法和属性来访问和修改数组,或者使用下标语法。

可以使用数组的只读属性count来获取数组中的数据项数量。

使用布尔属性isEmpty作为一个缩写形式去检查count属性是否为0。

可以使用append(_:)方法在数组后面添加新的数据项

除此之外,使用加法赋值运算符(+=)也可以直接在数组后面添加一个或多个拥有相同类型的数据项。(+=右边也是数组)

可以直接使用下标语法来获取数组中的数据项,把我们需要的数据项的索引值直接放在数组名称的方括号中:a[0]

可以用下标改变某个已有索引值对应的数据值:a[0]=3

还可以利用下标来一次改变一系列数据值,即使新数据和原有数据的数量是不一样的:

a[0...2]=[4,5,]  //首先数组a是可访问0、1、2三个下标的,将数组a的这一段用=右边的数组替换。即用长为2的数组替换原来从0到2下标的长为3的数组部分。

不可以用下标访问的形式去在数组尾部添加新项。

调用数组的insert(_:, at:)方法在某个具体索引值之前添加数据项

类似有remove(at:)方法来移除数组中的某一项。这个方法把数组在特定索引值中存储的数据项移除并且返回这个被移除的数据项。

数据项移除后会用之后的数据填补。

(数组的下标直接使用数字)

索引越界的数据进行检索或设置会引发运行时错误。

如果我们只想把数组中的最后一项移除,可以使用removeLast()方法而不是remove(at:)方法来避免我们需要获取数组的count属性。

数组的遍历:

可以使用for-in循环来遍历所有数组中的数据项:

for i in a{ print(a) }

如果我们同时需要每个数据项的值和索引值,可以使用enumerated()方法来进行数组遍历。enumerated()返回一个由每一个数据项索引值和数据值组成的元组。

for (index, value) in a.enumerated(){ print(index, value) }

集合Sets:

集合(Set)用来存储相同类型并且没有确定顺序的值,当集合元素顺序不重要或者希望确保每个元素只出现一次时可以使用集合而不是数组。

集合类型的哈希值:

一个类型为了存储在集合中,该类型必须是可哈希化的--也就是说,该类型必须提供一个方法来计算它的哈希值。一个哈希值是Int类型的,相等的对象哈希值必须相同。

Swift的所有基本类型(比如String、Int、Double和Bool)默认都是可哈希化的,可以作为集合的值的类型或者字典的键的类型。没有关联值的枚举成员值默认也是可哈希化的。

注意:可以使用自定义的类型作为集合的值的类型或者是字典的键的类型,但你需要使你的自定义类型符合Swift标准库中的Hashable协议。符合Hashable协议的类型需要提供一个类型为Int的可读属性hasValue。由类型的hasValue属性返回的值不需要在同一程序的不同执行周期或者不同程序之间保持相同。

因为Hashable协议符合Equatable协议,所以遵循该协议的类型也必须提供一个“是否相等”运算符(==)的实现。这个Equatable协议要求任何符合==实现的实例都是一种相等的关系。也就是说,对于a,b,c三个值来说,==的实现必须满足下面三种情况:

a==a;  a==b则b==a  a==b并b==c则a==c

集合类型语法:

Swift中的Set类型被写为Set<Element>,这里的Element表示Set中允许存储的类型,和数组不同的是,集合没有等价的简化形式。

创建和构造一个空的集合:

var a=Set<Character>()

此外,如果上下文提供了类型信息,比如作为函数的参数或者已知类型的变量或常量,我们可以通过一个空的数组字面量创建一个空的Set:

a.insert("a");  a=[]  //将a赋值成一个空的集合,由于之前a是一个字符类型集合,所以重赋值后也是字符类型集合

用数组字面量创建集合:

可以使用数组字面量来构造集合,并且可以使用简化形式写一个或者多个值作为集合元素。

var a:Set<Int>=[1,2,3]  //打印时的顺序不一定是以1,2,3为序

一个Set类型不能从数组字面量中被单独推断出来,因此Set类型必须显式声明。然而,由于Swift的类型推断功能,如果想使用一个数组字面量构造一个Set并且该数组字面量中的所有元素类型相同,那么无须写出Set的具体类型

访问和修改一个集合:

可以通过Set的属性和方法来访问和修改一个Set。

为了找到一个Set中元素的数量,可以使用其只读属性count。

使用布尔属性isEmpty作为一个缩写形式去检查count属性是否为0。

可以通过调用Set的insert(_:)方法来添加一个新元素。

可以通过调用Set的remove(_:)方法去删除一个元素,如果该值是该Set的一个元素则删除该元素并且返回被删除的元素值,否则如果该Set不包含该值,则返回nil。另外,Set中的所有元素可以通过它的removeAll()方法删除。

使用contains(_:)方法去检查Set中是否包含一个特定的值。

if a.contains(1){...}

遍历一个集合:

可以在一个for-in循环中遍历一个Set中的所有值。

for i in a{...}

Swift的Set类型没有确定的顺序,为了按照特定顺序来遍历一个Set中的值可以使用sorted()方法,它将返回一个有序数组,这个数组的元素排列顺序由操作符“<“对元素进行比较的结果来确定。

集合操作:

可以高效地完成Set的一些基本操作,比如把两个集合组合到一起,判断两个集合共有元素,或者判断两个集合是否全包含,部分包含或者不相交。

基本集合操作:

使用intersection(_:)方法根据两个集合中都包含的值创建一个新的集合。

使用symmetricDifference(_:)方法根据在一个集合中但不在两个集合中的值创建一个新的集合。

使用union(_:)方法根据两个集合的值创建一个新的集合。

使用subtracting(_:)方法根据不在该集合中的值创建一个新的集合。

集合成员关系和相等:

使用是否相等(==)判断两个集合是否包含全部相同的值。

使用isSubset(of:)方法判断一个集合中的值是否也被包含在另外一个集合中。

使用isSuperset(of:)方法判断一个集合中包含另一个集合中的所有值。

使用isStrictSubset(of:)或者isStrictSuperset(of:)方法判断一个集合是否是另外一个集合的子集合或者父集合并且两个集合并不相等

使用isDisjoint(with:)方法判断两个集合是否不包含有相同的值(没有交集)。

字典:

字典是一种存储多个相同类型的值的容器。每个值(value)都关联唯一的键(key),键作为字典中的这个值数据的标识符。和数组中的数据项不同,字典中的数据项并没有具体顺序我们在需要通过标识符(键)访问数据的时候使用字典,这种方法很大程度上和我们在现实世界中使用字典查字义的方法一样。

字典类型简化语法:

Swift的字典使用Dictionary<Key,Value>定义,其中Key是字典中键的数据类型,value是字典中对应于这些键所存储值的数据类型

一个字典的Key类型必须遵循Hashable协议,就像Set的值类型。

我们也可以用[Key:Value]这样简化的形式去创建一个字典类型。

创建一个空字典:

var a=[Int,String]()

将一个已有的字典赋值为空,假设其类型为[Int,String]:

a=[:]

用字典字面量创建字典:

可以使用字典字面量来构造字典。字典字面量是一种将一个或多个键值对写作Dictionary集合的快捷途径。

一个键值对是一个key和一个value的结合体。在字典字面量中,每一个键值对都由冒号分隔,不同键值对由逗号分隔。

var b=[1:"cjj",2:"xyy"]

访问和修改字典:

通过字典的方法和属性来访问和修改字典,或者通过使用下标语法。

用count只读属性来获取某个字典的数据项数量。

使用布尔属性isEmpty作为一个缩写形式去检查count属性是否为0。

也可以在字典中使用下标语法来改变特定键对应的值。

b[1]="jjc"

作为另一种下标方法,字典的updateValue(_:, forKey:)方法可以设置或者更新特定键对应的值。

b.updateValue("zz",forKey:1)

updateValue(_: , forKey:)方法会返回对应值的类型的可选值。如对于存储String值的字典,这个函数会返回一个String?或者”可选String“类型的值。

如果有值存在于更新前,则这个可选值包含了旧值,否则它将是nil。(所以updateValue(_:, forKey:)方法可以在字典中插入一个之前不存在的键)

可以使用下标语法来通过给某个键的对应值赋值为nil来从字典里移除一个键值对

b[1]=nil

此外,removeValue(forKey:)方法也可以用在字典中移除键值对。这个方法在键值对存在的情况下会移除该键值对并且返回被移除的值或者在没有值的情况下返回nil。

字典遍历:

可以使用for-in循环来遍历某个字典中的键值对。每一个字典中的数据项都以(key,value)元组形式返回,并且可以使用临时常量或者变量来分解这些元组。

for (k,v) in b{print(k,v)}

通过keys或者values属性,可以遍历字典的键或者值。

b.keys和b.values分别是字典的键和值的无序集合Set。

Swift的字典类型是无序集合类型。为了以特定的顺序遍历字典的键或值,可以对字典的keys或values属性使用sorted()方法。

猜你喜欢

转载自www.cnblogs.com/cjj-ggboy/p/12822309.html