窥探Swift之数组与字典

说到数组和字典,只要是编过程的小伙伴并不陌生。在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。具体用法以下,移除元素成功后会以元组的形式返回被删除的值。

相关文章
相关标签/搜索