美文网首页
Swift 3 Collections

Swift 3 Collections

作者: 婉卿容若 | 来源:发表于2017-02-24 10:36 被阅读26次

    学习网站 - 泊学

    泊学-服务于一线开发者的前沿技术视频


    我的笔记

    Array
    • 元素有先后顺序
    • 通过位置关系访问元素
    • 对数组增删改查时必须自行确保索引的安全性
    // create array
    
    var array01: Array<Int> = Array<Int>()
    //var array02 = [Int]()
    var array02: [Int] = []
    var array03 = array02
    
    // create array and specifies the initial value defined at the same time
    var threeInts = [Int](repeatElement(3, count: 4))
    var sixInts = threeInts + threeInts
    var fiveInts = [1,2,3,4,5]
    
    if sixInts.isEmpty{
        print("this array is empty")
    }
    
    // use `range operator` to access to an array
    // return: ArraySlice which is a period of an array => 什么是ArraySlice呢?简单来说,就是Array某一段内容的view,它不真正保存数组的内容,只保存这个view引用的数组的范围:
    fiveInts[0...2]
    fiveInts[0..<2]
    Array(fiveInts[0..<2])
    
    // traversing the array - 遍历数组
    for value in fiveInts{
        print(value)
    }
    
    for (index, value) in fiveInts.enumerated(){
        print("\(index)" + "\(value))")
    }
    
    fiveInts.forEach { (value) in
        print(value)
    }
    
    // add + delete
    
    fiveInts.append(6)
    //fiveInts += fiveInts
    fiveInts.endIndex
    fiveInts.insert(100, at: fiveInts.endIndex)
    fiveInts.remove(at: fiveInts.endIndex-1)
    fiveInts.removeLast()
    
    
    
    Array 与 NSArray 的差异
    1. swift 中 array: 值类型; copy on write.
    2. NSArray: 数组能否被修改由 NSArray与 NSMutableArray决定; NSArray与 NSMutableArray都是类对象,复制他们执行的是引用语义
    // ### Array and NSArray
    
    var a = [1,2,3]
    let copyA = a // 此时,真正的copy并没有发生,两个数组仍旧引用同一个内存地址
    
    //a.append(4) // 修改了 a 数组,两个数组对象分开,有了各自的地址
    
    // 实例验证
    func getBufferAddress<T>(of array: [T]) -> String{
        return array.withUnsafeBufferPointer({ buffer in
            return String(describing: buffer.baseAddress)
        })
        
        // withUnsafeBufferPointer是 array 的一个方法,他可以把保存的 Array 内容的地址传递给它的 closure 参数
    }
    
    getBufferAddress(of: a)
    getBufferAddress(of: copyA)
    
    a.append(4)
    
    getBufferAddress(of: a)
    getBufferAddress(of: copyA)
    
    // 深拷贝 -- 拷贝了值,而不是拷贝地址
    // 浅拷贝 -- 拷贝了地址
    let b = NSMutableArray(array: [1,2,3,4])
    let copyB: NSArray = b
    let deepCopy = b.copy() as! NSArray
    
    b.insert(0, at: 0) // [0, 1, 2, 3, 4]
    
    copyB // [0, 1, 2, 3, 4]
    
    deepCopy // [1, 2, 3, 4]
    
    swift 中的 Array
    1. 抛弃通过下标访问数组 -- 越界去死
    2. partition(by:)则会根据指定的条件返回一个分界点位置。这个分界点分开的两部分中,前半部分的元素都不满足指定条件;后半部分都满足指定条件
    3. map/filter/reduce/contains

    Ps: // 计算变量内存大小
    MemoryLayout.size(ofValue: sa)

    set
    1. 无序集合(unordered collection)类型
    2. 当我们要定义一个Set对象时,必须明确使用type annotation。Type inference会把这样的定义方式推导为一个Array
    3. 当遍历一个Set时,访问元素的顺序,并不是我们定义Set时的顺序,这也就是unordered collection的含义。
    var setA: Set<Int> = [1,2,3,4,5,6,7]
    setA.forEach { (t) in
        print(t)
        return
    }
    //setA.count
    //setA.isEmpty
    //setA.remove(7)
    //setA.insert(55)
    //setA.contains(44)
    
    var setB: Set = [5,6,7,8,9,10]
    // 交集
    let intersectionAB = setA.intersection(setB)
    // 并集
    let unionAB = setA.union(setB)
    // 并集取反
    let symmetricDifferenceAB = setA.symmetricDifference(setB)
    // A独有的
    let subtrectingAB = setA.subtracting(setB)
    

    源码地址

    相关文章

      网友评论

          本文标题:Swift 3 Collections

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