说到数组和字典,只要是编过程的小伙伴并不陌生。在Swift中的数组与字典也有着一些让人眼前一亮的特性,今天的博客就来窥探一下Swift中的Array和Dictionary。仍是沿袭以前的风格,在介绍Swift中的数组时,咱们会对比一下ObjC中的数组和字典,由于ObjC也是iOS开发的主要语言不是。不管是简单仍是复杂的程序,数组和字典的用处仍是比较多的,这二者虽然是Swift的基础内容,可是也不失其重要性。关于Objc的集合类请参考以前的博客《Objective-C中的集合类》。html
1、Swift中的数组(Array)编程
数组在其余编程语言中都是存在的,数组就是一组数的集合。虽然其余编程语言中都有数组,可是不一样语言中的数组都有着一些属于本身的特性。Swift也不例外,Swift中的数组使用起来仍是比较人性化的.数组
1.数组的声明与建立app
在聊Swift中的Array声明建立以前,我想聊一下ObjC中数组的声明与建立,下方是ObjC中不可变数组和可变数组的建立方式。在ObjC中可使用NSArray来声明不可变数组,使用NSMutableArray来声明可变数组。编程语言
1 NSArray *objcArray01 = [NSArray array]; 2 NSArray *objcArray02 = @[@(1), @(2)]; 3 4 NSMutableArray *mutableArray = [NSMutableArray array];
而在Swift语言中,你可使用关键字let来声明不可变数组,使用var来声明可变数组,下方代码声明的是Swift中的可变数组的几种方式。有一点须要注意的是ObjC中的数组只容许往里面存储对象,而不容许往里存储基本数据类型(Int, Float等)。而在Swift中是容许把基本数据类型存入数组中的,以下方代码段所示。下方给出了数组的三种定义的方式。后两种给数组元素制定了数据类型,表示该数组中只可以存储Int类型的值,若是你往里存入了其余的值,对不起,编译器会报错的。函数
在Swift的数组中,若是在声明数组时没有指定数组中元素的数据类型,那么数组中是能够存放不一样数据类型的数据的。若是你指定了数组中只容许存储一种数据类型,若是你再往里存储其余数据类型的话,那就是你的不对了,编译器回给你指出你的错误。具体以下所示:post
2.数组的操做url
(1)可变与不可变数组spa
若是你想对数组中的元素进行增长、修改或者删除,那么你须要把Array定义成可变数组。若是你把数组定义成了不可变数组,可是你又对他进行了操做,那就是你的不对了。不管是ObjC仍是Swift都不容许对不可变数组这位高冷的“御姐”动手动脚,否则会抛出一个错误的。可是可变数组就不同了,你能够对可变数组进行增删改查操做。3d
下图是在ObjC中对NSArray操做后的结果,你不能对NSArray中的元素进行修改,也就是说你对NSArray的操做权限只有读的权限,没有写的权限。若是你想对数组进行读写的权限的话,那你就有必要使用可变数组NSMutableArray了。使用NSMutableArray就不会报错,由于你对它有读写的权限。
在Swift中的可变数组和不可变数组归根结底仍是变量和常量也就是var和let关键字的使用了。你对变量持有读写的权限,对常量持有读的权限。下方的小实例,本质仍是对let和var的讨论,下方是Swift实例:
(2) 插入元素
上面Swift实例中已经展现了如何往数组中插入元素。Swift中往数组中插入元素和OC中使用的方法是同样的,只是调用方法的方式不一样。下方代码就是往可变数组arrayTest中的索引1的位置插入一个值“Objc”。语法比较简单就不作过多的赘述了。
1 arrayTest.insert("Objc", atIndex: 1);
(3) 元素以及数组的追加
你可使用append函数来往数组的尾部追加值。若是你想把另外一个数组追加到一个数组的后方,你可使用+=运算符来操做。使用+=能够链接数组,这也是Swift中使人兴奋的一个特色。具体操做请看下方的实例:
(4)移除元素
上面是添加,接下来要搞一下移除元素。其实Swift中数组移除的方法名和用法和Objective-C中移除可变数组中的元素的方式极为类似。下方截图中是常用的移除方法,用法都没有什么难理解的地方,在此就简单的聊上一嘴。
Void removeAll(): 移除数组中所有元素,有一个可选参数,keepCapacity。若是keepCapacity = YES的话,那么数组移除元素后,其存储空间仍是存在的,在此往里存储值,不需再给他分配存储空间了。若是keepCapacity=NO的话,那么数组的存储空间就会被回收掉。
String removeAtIndex(): 移除指定索引的元素,而且返回被移除的元素。
String removeFrist(): 移除第一个元素,并返回被移除的元素。
Void removeFirst(n: Int): 这个函数的意思是移除数组前方的几个元素,若是n = 1, 的话就移除前面一个元素这时与String removeFirst()函数功能相同。若是n = 3, 就移除前3个元素。
String removeLast(): 移除数组中最后一个元素。
Void removeRange(subRange: Range<Int>): 这个函数就比较全能呢,它能够移除数组中有效范围内的连续元素。它须要一个Range参数,下方是这个函数的使用方法,Range的起始位置是1,结束位置是2,就是移除索引1到2之间的元素。能够看Playground中的提示。 Range(start:1, end:2) 表明着半开区间1..<2。
3. 使用Array构造函数给数组赋初始值
在一些应用场景中咱们须要为数组中的每一项进行初始化,也就是给数组的每一项赋上初始值。举个栗子~,好比咱们要使用一个数组来记录公司每一个季度的销售额,在数组初始化时,咱们给给数组初始化4个初始值为零的元素。接下来就使用Array构造函数来作一些事情。下方就是在数组建立时给数组赋初始值。
2、Swift中的字典(Dictionary)
Swift中字典和Objective-C中的字典除了语法不同外,用法也是大同小异的。字典中存放的就是Key和Value也就是键值对。能够经过Key来取出Value的值,在PHP这门强大的语言中,Array和Dictionary就是一个东西。其实数组就是一种特殊的字典,数组的key就是其下标,只不过这个下标不须要你去指定,由系统分配好,而且是元素在数组中是按下标从小到大排列的。在字典中的键值对是没有固定顺序的。
1. 字典的建立
在Swift中字典的建立和数组的建立也是相似的,就是比数组的item多了一个key。下方建立了两个字典,第一个字典是指定了key与value的数据类型,第二个字典没有为键值指定固定的数据类型。从Playground中咱们容易的看出字典中的数据是没有固定数据的,由于读取字典中的值是经过key-value的形式而不是经过下标的方式。下方建立的都是可变字典,由于咱们使用的是var关键字进行修饰的,若是你要建立不可变数组,咱们就可使用let关键字进行建立。关于let建立字典的内容,在此就不作过多的赘述了,由于只须要把下方的var换成let便可。
2. 字典item的增删改查
(1) 查询字典的值(读取)
咱们能够经过字典键值对的key来取出key对应的value。 下方的代码是分别取出“大毛”和“小黄”的值,以下所示:
(2)字典的遍历
只取一个值那多不爽呢,下面介绍一下字典的遍历方法。下方是遍历输出字典myDog中全部的key,字典的keys属性是获取字典中全部的key值。
上述代码段输出结果以下,由输出结果可知,每一个Value是可选类型的数据:
key: Optional("黄2") key: Optional("小黄") key: Optional("大黄")
===============================================================================
上面是获取字典中的全部keys, 那么下面是获取字典中的全部values, 具体代码以下所示:
上述代码段输出的结果值以下:
1 value:黄2 2 value:小黄 3 value:大黄
===============================================================================
接下来就是对字典的整个item进行遍历,每一个item遍历出来是一个元组。元组的内容是(key, value)。遍历出来的元组咱们就能够经过使用元组的形式来获取字典的key和value。具体代码以下所示:
输出结果以下:
1 元组:(2, "黄2") 2 key: 2 3 value: 黄2 4 5 元组:(3, "小黄") 6 key: 3 7 value: 小黄 8 9 元组:(1, "大黄") 10 key: 1 11 value: 大黄
(3) 字典的修改
字典元素的修改是比较简单的,下方经过两种。第一种是经过key的形式直接给key对应的value赋值,不过这种修改方式是不会返回被修改的值的,具体代码以下:
若是你想在修改值的时候返回被修改的原始值的话,你须要使用updateValue(forKey:)方法进行元素的修改。该函数是能够返回被修改的原始值的,具体实例以下所示:
(4) 增长元素
往已有的可变字典中增长元素就简单多了,直接经过key就能够给value赋值。在可变字典中,若是key已经存在,那么就变成上面的修改字典的值了。能够这么理解,经过key给value赋值时,若是key存在,就覆盖原有的键值对,若是不存在就添加。下方就是往字典中进行添加元素的语句:
(5)移除元素
下方截图中是全部字典移除元素的方法,
removeAll():移除全部元素。
removeAll(keepCapacity: Bool):移除全部元素, 若是keepCapacity为True,则保留字典原有的存储空间。
removeValueForkey(key: Hashable): 这个方法是经过key来移除元素的。
removeAtIndex(index: DictionaryIndex<Hashable, Value>):这个是经过Dictionary的索引来删除元素的。可是字典的item是没有顺序的,那么咱们怎么获取这个DictionaryIndex呢? 那么咱们就会使用到另外一个函数,就是indexForKey。具体用法以下,移除元素成功后会以元组的形式返回被删除的值。