美文网首页菜鸟Swift之路
【Swift】 Collections初识 - Array(二)

【Swift】 Collections初识 - Array(二)

作者: 修羅童鞋 | 来源:发表于2017-05-19 21:57 被阅读0次

    声明:此博客是本人在泊学网学习Swift过程的笔记与心得

    III. Array正确的访问方式

    如果使用了一段时间Swift的会发现,Swift并不喜欢使用C风格的遍历循环方式,因为Swift提供了Optional的安全措施,而这些传统C风格方式并没有很好地利用它,因此,Swift拥有自己的一套遍历规则。

    1.forEach

    let arr = [1, 2, 3, 4, 5]
    
    // 忘记C风格的[]吧
    for (int i=0; i<5; i++) { ... }
    
    // 这才是Swift的Array的正确遍历方式
    for item in arr {
        print("\(item)")
    }
    
    // or
    arr.forEach { print("\($0)") }
    

    而且,也可以通过Array.enumerated()来获取一个EnumeratedSequence对象,为(index, value)的形式,包含索引与值

    for (index, value) in arr.enumerated() {
        print("arr[\(index)]: \(value)")
    }
    

    2.index

    当想获取固定index位置的值时,也无需通过[]的方式获取

    arr.index { $0 == 1 } // 2
    

    这样,如果index为1没有值时(越界),也会返回nil而非crash,保证了安全
    当然Swift也提供了关于index的多个API

    arr.index(before: 1) // 1
    arr.index(after: 1) // 3
    arr.index(of: 1) // 0 (获取of的值的index)
    ...
    

    3.几个特殊属性

    arr.first // 1
    arr.last // 5
    arr.min() // 1
    arr.max() // 5
    arr.popLast() // 5
    arr.removeLast() // 4
    

    值得注意的是,popLast()得到的是Optional类型,如果arr为空,则可以返回nil,而removeLast()则不会,只能等待crash的降临吧!

    4.filter

    Swift中Array可以通过filter来筛选元素

    arr.filter { $0 % 2 == 0 } // 筛选所有偶数
    

    5.map

    这样的代码经常出现在项目中

    var arrS = [Int]()
    for value in arr {
        arrS.append(value * value)
    }
    

    那么,map才是你的选择

    var arrM = arr.map { $0 * $0 }
    

    简单明了

    此外,Swift也提供了一个flatMap的方式来打破闭包的Array返回值,当闭包的返回值是Array时,一旦我们进行嵌套操作,就会出现多维数组,而flatMap就是用来将多维数组变成一维数组的

    let arr2 = ["A", "B", "C"]
    let a = arr.map { num in
        return arr2.map { word in
            return [word: num]
        }
    }
    
    a的结果

    很乱是不是!?
    所以flatMap的作用就来了

    let b = arr.flatMap { num in
        return arr2.map { word in
            return [word: num]
        }
    }
    
    b的结果

    6.sorted

    当给Array排序时,是否还在烦恼选择冒泡还是快排等,那么,Swift中你只需要提供排序的规则,并实现Equaltable协议,就可以一步完成了

    let arrSorted1 = arr.sorted(by: >)
    let arrSorted2 = arr.sorted { $0 > $1 }
    

    7.reduce

    一般用于合并

    let arrSum = arr.reduce(0, +) // 15 = 0 + 1 + 2 + 3 + 4 + 5 
    

    8.contains

    当需要判断Array中是否包含符合某些条件的元素时,可以使用contains,返回Bool类型结果

    arr.contains { $0 % 2 == 0 } // 判断是否包含偶数 true
    

    contains还有一个好处,就是遇到第一个符合条件的元素,就直接返回true跳出,极大的提高了效率

    9.比较

    当我们需要比较两个数组是否相等时,我们也只需提供比较方法就可以便利的获取两个数组是否相等,for这个关键字就不需要出现了

    let arrTemp = [0, 1, 2, 3, 4]
    arr.elementsEqual(arrTemp, by: { $0 == $1 }) // false
    arr.elementsEqual(arrTemp, by: { $0 == $1 + 1 }) // true
    

    Swift还提供一个类似的API,判断是否以特定元素序列开始的

    arr.starts(with: [1, 2, 3], by: { $0 == $1 }) // true [1, 2, 3, ...]
    

    如果这样简单的介绍,无法了解这些方法的内部实现,那请看下一篇 造轮子

    相关文章

      网友评论

        本文标题:【Swift】 Collections初识 - Array(二)

        本文链接:https://www.haomeiwen.com/subject/naysxxtx.html