Swift Tips - Array 类型

我与影子孤独终老i 提交于 2020-02-25 12:08:10

在开发中,数组这个概念我们应该很熟悉了,Objective-C 中为我们提供了 NSArray 作为数组的实现。大家应该对很熟悉了。而在 Swift 中,为我们提供了它自己对于数组的实现,也是这里我们要介绍的,就是 Array 类。

Array 的官方文档可以参看这里: SwiftStandardLibraryReference

废话不多说,下面就开始我们的主题啦。

<!-- more -->

创建数组

我们要使用一个数组,首先要做的就是创建它,Array 类为我们提供了几种方式来创建:

var emptyArray = Array<Int>()

我们这里声明了一个空的数组,数组的元素是 Int 类型,我们还可以这样初始化数组:

var equivalentEmptyArray = [Int]()

这样的写法和前面那个的效果是一样的。我们还可以这样进行初始化:

let numericArray = Array(count: 4, repeatedValue: 5)
// 数组元素为 [5,5,5,5]

这个初始化方法,里面使用 4 个数字 5 来填充这个数组,并且数组元素的类型为 Int

访问数组的元素

我们的数组创建完成后,我们就可以通过下标来引用它里面的元素了:

var weekdays = ["monday","tuesday","wednesday","thursday"]
println(weekdays[1])   //输出 tuesday

我们还可以通过下标来修改数组中的元素:

var weekdays = ["monday","tesday","today","thursday"]
weekdays[2] = "wednesday"  
//修改后的数组元素 ["monday","wednesday","today","thursday"]

但我们不能通过下标修改 let 关键字定义的常量数组:

let weekdays = ["monday","tesday","today","thursday"]
weekdays[2] = "wednesday"   //报错

Swift 还提供了范围的下标访问:

let weekdays = ["monday","wednesday","today","thursday"]
let subdays = weekdays[0...2]
//subdays 的数组元素 ["monday","wednesday","today"]

我们用 arr[0...2] 这种形式的索引,就可以访问到数组中某一区域的元素了,这点从上面的例子中就能看出来啦。

我们甚至还可以用范围索引来设置数组的元素,前提是这个数组是用 var 定义的:

var weekdays = ["monday","wednesday","today","thursday"]
weekdays[0...1] = ["today","tomorrow"]
//数组的元素 ["today","tomorrow","today","thursday"]

添加删除元素

Swift 中的 Array 还为我们提供几个相关的方法,append 用于向数组添加元素,添加的元素在数组的最后。insert 方法向数组指定的索引插入元素, removeAtIndex 方法用来删除指定索引位置的元素。 removeLast 用于删除数组最后一个元素。我们来看一下如何使用这些方法:

var numbers = [2,4,6,8,10]
numbers.append(12)              //numbers: [2,4,6,8,10,12]
numbers.insert(5, atIndex: 2)   //numbers: [2, 4, 5, 6, 8, 10, 12]
numbers.removeAtIndex(4)        //numbers: [2, 4, 5, 6, 10, 12] 
numbers.removeLast()            //numbers: [2, 4, 5, 6, 10]

这几个方法使用起来非常方便,也满足了我们对数组的大部分操作要求,接下来我们继续。

查询数组状态

Array 提供了 count 属性来返回数组当前的元素个数。 isEmpty 属性用于判断数组是否为空。

var array = [5,4,3,2,1]
println(array.count)        // 5
println(array.isEmpty)      // false
array = []
println(array.isEmpty)      // true

数组算法操作

sort 方法

除了上面那些使用的方法,Array 还提供了几个方便的算法操作,sort 方法用于对数组进行排序,我们可以很轻松的就实现数对数组的升序和降序排列:

var array = [4,5,6,8,3,1,5,7,9]
array.sort {$0 < $1}    
print(array)            //array: [1, 3, 4, 5, 5, 6, 7, 8, 9]

sort 方法接受一个回调方法,用于返回两个值的比较顺序,我们上面的例子中,判断第一个参数是否比第二个参数的值小,这样就形成了一个升序排列。

sorted 方法

Array 还提供了一个 sorted 方法,这个方法和 sort 方法基本一样,也是接受一个回调方法用于确定元素间的顺序。唯一一点不同的是,sort 是对数组本身进行排序,也就是意味着 sort 方法会修改数组本身的内容。 而 sorted 就不会修改原有的数组,而是返回一个经过排序处理后的新的数组:

var array = [4,5,6,8,3,1,5,7,9]
var newArray = array.sorted {$0 < $1}    
print(newArray)            //array: [1, 3, 4, 5, 5, 6, 7, 8, 9]

使用 sorted 方法后,我们得到了一个新的数组。

reverse 方法

Arrayreverse 方法可以将数组中的元素倒序排列:

let array = [1, 2, 3, 4, 5]
let reversedArray = array.reverse()
// reversedArray = [5, 4, 3, 2, 1]

通过这个方法,我们将数组中的元素顺序颠倒了。

filter 方法

Array 还提供了一个 filter 方法,可以根据传入的回调方法的判断标准来筛选数组的元素,并返回一个新的数组:

var array = [1, 2, 3, 4, 5,7,8,9]
var newArr = array.filter({$0 % 2 == 0})    //[2,4,8]

这个 filter 方法,筛选出 array 数组中的所有偶数,并返回给新的 newArr 数组。

map 方法

是不是觉得 Array 提供了很多便捷的方法呢,还远不止如此呢,这个 map 方法就更加强大了。它能够根据制定的规则对数组的元素进行处理:

var array = [1,3,5,7]
var newArr = array.map({$0 * 2})    //[2, 6, 10, 14]

这个 map 方法的调用将数组中的所有元素都乘以2,返回了一个新的数组。

怎么样,非常方便吧,有没有感觉这些便捷的方法省去了你很多的 for 循环之类的东西呢,从此你的代码更加简洁明快了,心情也更为舒畅了吧。接下来我们再来了解一个。

reduce 方法

这个方法更有意思,reduce 的字面为减少执意,用在我们这里就是通过一个处理方法,将数组中所有的元素进行处理,并最终产生一个值:

    let array = [1, 2, 3, 4, 5]
    let addResult = array.reduce(0) { $0 + $1 }
    //addResult: 15

看过上面这段代码就很明白了吧,通过 { $0 + $1 } 这个闭包方法,我们将数组中所有的元素累加起来,并返回给一个新的变量。

对操作符的支持

到这里,你是不是觉得 Array 很好用呢,还不止如此,Swift 中的 Array 还提供了对操作符的支持,我们可以使用 += 操作符,来对两个数组进行连接:

var array = [0, 1, 2, 3]
array += [4, 5, 6]
// array is [0, 1, 2, 3, 4, 5, 6]

很方便吧。

好了,讲了这么多,相信大家对 Array 类已经有了一个大概的了解了。为我们提供的这些方法,可以很明显的减少我们的代码量,提升我们的开发效率。比如我们刚刚提到的 += 操作符的支持。如果没有这个操作符支持,我们要对两个数组进行连接的话,我们就需要写 for 循环,还有好多冗余的代码。

相信如果大家理解了这些方法的使用,它们就能够帮助你大大的提高开发效率。起到事半功倍的作用。这篇文章只是对 Array 类的一个大体的介绍,关于 Array,相信还有很多有待发掘的东西,这个机会就交给电脑前的你们了,欢迎大家把在开发过程中关于 Array 的问题和经验在下面留言和大家一起分享交流。

更多文章请访问: www.theswiftworld.com

更多好文,扫码关注微信公众号:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!