Swift 3 Collections

2017-02-24  本文已影响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)

源码地址

上一篇下一篇

猜你喜欢

热点阅读