数组的创建
- 字面量创建
- 可以使用数组字面量来初始化一个数组,它是一种以数组集合来写一个,或者多个值的简写方式,数组字面量写作一系列的值,用都好分隔,用方括号括起来
- 创建空数组的时候必须携带类型信息
- 如果内容已经提供了类型信息,你可以通过空数组字面量来创建一个空数组
var array = [1, 2, 3, 4]
array = []
let arr:[Int] = []
let arr2 = [Int]()
let arr3: Array<Int> = []
- 初始化器
- 初始化器有两种方式 1.类型 2.Array<类型>()
var myArray = [String]()
var myArray2 = Array<String>()
2.初始器参数
- init(repeating repeatedValue: Element, count: Int)
- init(arrayLiteral elements: Element...)
let fiveZs = Array(repeating: "Z", count: 5)
print(fiveZs)
let chars = Array("hello")
print(chars)
let numbers = Array(1...9)
print(numbers)
- init<S>(_elements: S) where S : Sequence, Self.Element == S.Element
- init(from decoder: Decoder) throws
let number = [Int](0...7)
print(number)
let persons = ["zhangsan": 27, "lisi": 28, "wangwu": 29]
let names = [String](persons.keys)
print(names)
数组的遍历和索引(访问和操作数组)
- 数组遍历
- For-in
let numbers = [Int](1...7)
for index in numbers {
print(index)
}
- forEach 方法
- 无法使用 break 或 continue 跳出或者跳过循环
- 使用 return 只能退出当前一次循环的执行体
let numbers = [Int](0...7)
numbers.forEach { (num) in
if num == 3 {
return
}
print(num * 10)
}
3.同时得到索引和值 enumerated()
let numbers = [Int](1...7)
for (index, num) in numbers.enumerated() { //拆包
print("the index is \(index)")
print(num * 10)
}
4.使用 Iterator 遍历数组
let numbers = [Int](1...7)
var numIterator = numbers.makeIterator() //迭代器
while let num = numIterator.next() {
print(num * 10)
}
- 数组索引
- starIndex 返回第一个元素的位置,对于数组来说,永远都是0
- endIndex 返回最后一个元素索引 +1 的位置,对于数组来说,等同于 count
- 如果数组为空,startIndex 等于 endIndex
- indices 获取数组的索引区间
let numbers = [Int](1...7)
for i in numbers.indices {
print(numbers[i] * 10)
}
数组访问和操作(查找操作)
- 判断是否包含指定元素
- contains(_:) 判断数组是否包含给定元素
- contains(where:) 判断数组是否包含符合给定条件的元素
let numbers = [Int](5...10)
print(numbers.contains(5))
print(numbers.contains(where: { $0 > 9 }))
- 判断所有元素符合某个条件
- allSatisfy(_:) 判断数组的每一个元素都符合给定的条件
let numbers = [Int](5...10)
print(numbers.allSatisfy({ $0 > 7}))
print(numbers.allSatisfy({ $0 > 4}))
- 查找元素
- first 返回数组第一个元素 (Optional), 如果数组为空, 返回nil
- last 返回数组最后一个元素 (Optional), 如果数组为空,返回nil
- first(where:) 返回数组第一个符合给定条件的元素 (Optional)
- last(where:) 返回数组最后一个符合给定条件的元素 (Optional)
let numbers = [Int](5...10)
print(numbers.first)
print(numbers.last)
print(numbers.first(where: { $0 > 7 }))
print(numbers.last(where: { $0 < 7 }))
- 索引查找
- firstIndex(of:) 返回给定的元素在数组中出现的第一个位置 (Optional)
- lastIndex(of:) 返回给定的元素在数组中出现的最后一个位置 (Optional)
var array = [10, 20, 30, 40, 30, 20, 10]
print(array.firstIndex(of: 30))
print(array.lastIndex(of: 20))
- firstIndex(where:) 返回符合条件的第一个元素的位置 (Optional)
- lastIndex(where:) 返回符合条件的最后一个元素的位置 (Optional)
var array = [10, 20, 30, 40, 30, 20, 10]
print(array.firstIndex(where: { $0 > 25 }))
print(array.lastIndex(where: { $0 > 25 }))
- 查找最大最小元素
- min() 返回数组中最小的元素
- max() 返回数组中最大的元素
- min(by:) 利用给定的方式比较元素,并返回数组的最小元素
- max(by:) 利用给定的方式比较元素,并放回数组的最大元素
var array = [7, 5, 30, 40, 32, 40, 5]
print(array.min())
print(array.max())
var errors = [(0, "worring"), (100, "error"), (200, "success")]
print(errors.min(by: { a, b in a.0 < b.0 }))
print(errors.max(by: { a, b in a.0 < b.0 }))
errors = [(0, "b"), (100, "a"), (200, "d")]
print(errors.min(by: { a, b in a.1 < b.1 }))
数组添加和删除操作
- 在末尾添加
- append(:) 在末尾添加一个元素
var numbers = [Int](2...7)
numbers.append(100)
print(numbers)
- append(contentsOf:)在末尾添加多个元素
var numbers = [Int](2...7)
numbers.append(contentsOf: 200...203)
print(numbers)
- 在任意位置插入
- insert(_:at:) 在指定的位置插入元素
var numbers = [Int](2...7)
numbers.insert(-1, at: 1)
print(numbers)
- insert(contentsOf:at:) 在指定位置插入多个元素
var numbers = [Int](2...7)
numbers.insert(contentsOf: 100...105, at: 1)
print(numbers)
3.字符串也是 Collection, Element 是 Character 类型
var chars: [Character] = ["a", "b", "c"]
chars.insert(contentsOf: "hello", at: 0)
print(chars)
- 移除单个元素
- remove(at:) 移除并返回指定位置的一个元素
var numbers = [Int](2...7)
let removeNum = numbers.remove(at: 1)
print(removeNum)
print(numbers)
- removeFirst() 移除并返回数组的第一个元素
var numbers = [Int](2...7)
let num = numbers.removeFirst() //不能为空数组
print(num)
print(numbers)
- removeLast() 移除并返回数组的最后一个元素
var numbers = [Int](2...7)
let endNum = numbers.removeLast() //不能为空数组
print(endNum)
print(numbers)
- popFirst() 移除并返回数组的第一个元素(optional), 数组为空返回nil
let popNum = numbers.popLast() //可为空数组
print(popNum)
print(numbers)
- 移除多个元素
- removeFirst(:) 移除数组前面多个元素
var numbers = [Int](2...7)
numbers.removeFirst()
print(numbers)
numbers.removeFirst(2) //从开始移除的个数
print(numbers)
- removeLast(:) 移除数组后面多个元素
var numbers = [Int](2...7)
numbers.removeLast()
print(numbers)
numbers.removeLast(2) //从末尾移除的个数
print(numbers)
- removeSubrange(:) 移除数组中给定范围的元素
numbers.removeSubrange(1...3)
print(numbers)
- removeAll() 移除数组所有元素
numbers.removeAll()
print(numbers)
print(numbers.capacity)
- removeAll(keepingCapacity:) 移除数组所有元素,保留数组容量(如果移除之后重新添加,建议保留数组容量)
numbers.removeAll(keepingCapacity: true)
print(numbers)
print(numbers.capacity)
ArraySlice(数组切片)
- 移除多个元素
- ArraySlice 是数组或者其他 ArraySlice 的一段连续切片,和原数组共享内存。
- 当要改变 ArraySlice 的时候,ArraySlice 会 copy 出来,形成单独的内存
- ArraySlice拥有和 Array 基本完全类似的方法
- 通过 Drop 得到 ArraySlice
- dropFirst(:) 移除原数组前面指定个数的元素,得到一个 ArraySlice
- dropLast(:) 移除原数组后面指定个数的元素,得到一个 ArraySlice
- drop(:) 移除原数组符合指定条件的元素得到一个 ArraySlice
let numbers = [1, 10, 21, 98, 32, 53, 67, 89]
print(numbers)
print(numbers.dropFirst())
print(numbers.dropFirst(3))
print(numbers.dropLast())
print(numbers.dropLast(3))
print(numbers.drop(while: { $0 < 50 }))
- 通过 prefix 得到 ArraySlice
- prefix() 获取数组前面指定个数的元素组成的 ArraySlice
- prefix(upTo:) 获取数组到指定位置 (不包含指定位置) 前面的元素组成的 ArraySlice
- prefix(through:) 获取数组到指定位置 (包含指定位置) 前面的元素组成的 ArraySlice
- prefix(while:) 获取数组前面符合条件的元素 (到第一个不符合条件的元素截止) 组成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers.prefix(4))
print(numbers.prefix(upTo: 4))
print(numbers.prefix(through: 4))
print(numbers.prefix(while: { $0 < 5 }))
- 通过 suffix 得到 ArraySlice
- suffix() 获取数组后面指定个数的元素组成的 ArraySlice
- suffix(from:) 获取数组从指定位置到结尾 (包含指定位置) 的元素组成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers.suffix(3))
print(numbers.suffix(from: 5))
- 通过 Range 得到 ArraySlice
- 可以通过对数组下标指定 Range 获取 ArraySlice,可以使用闭区间、半开半闭区间、单侧区间、甚至可以只是用...来获取整个数组组成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers[3...5])
print(numbers[3..<5])
print(numbers[...2])
print(numbers[..<2])
print(numbers[6...])
print(numbers[...])
- ArraySlice 转为 Array
- ArraySlice 无法直接赋值给一个 Array 的常量或变量,需要使用 Array(slice)
var numbers = [Int](1...9)
let slice = numbers[3...5]
numbers = Array(slice)
print(numbers)
- ArraySlice 和原 Array 相互独立
- ArraySlice 和原 Array 相互独立的,他们添加删除元素不会影响对方
var numbers = [Int](1...3)
var slice = numbers.dropLast()
numbers.append(4)
print(slice)
print(numbers)
slice.append(5)
print(slice)
print(numbers)
数组重排
- 数组元素的随机化
- shuffle() 在原数组上将数组元素打乱,只能作用在数组变量上
- shuffled() 返回原数组的随机化数组, 可以作用在数组常量和变量上,并不改变原数组
var numbers = [Int](0...9) //随机播放
numbers.shuffle()
print(numbers)
let array = [Int](0...9)
var arr = array.shuffled()
print(arr)
print(array)
- 数组的逆序
- reverse() 在原数组上将数组逆序,只能作用在数组变量上
- reversed() 返回原数组的逆序“集合表示”,可以作用在数组变量和常量上,该方法不会重新分配新内存空间
var numbers = [Int](0...9)
numbers.reverse()
print(numbers)
let array = [Int](0...9)
var arr = array.reversed()
print(arr) //共享内存
print(array)
for index in arr {
print(index)
}
- 数组的分组
- partition(by belongsInSecondPartition:(Element) throws -> Bool) 将数组以某个条件分组,数组前半部分都是不符合条件的元素,数组后半部分都是符合条件的元素
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
let index = numbers.partition { (element) -> Bool in
element > 30
}
print(numbers)
let partition1 = numbers[..<index]
let partition2 = numbers[index...]
print(partition1)
print(partition2)
- 数组的排序
- sort() 在原数组上将元素排序,只能组用于数组变量。
- sorted() 返回原数组的排序结果数组,可以作用在数组变量和常量上
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
numbers.sort()
print(numbers)
let array = [10, 20, 45, 30, 98, 101, 30, 4]
let arr = array.sorted()
print(arr)
print(array)
- 交换数组两个元素
- swapAt(::) 交换指定位置的两个元素
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
numbers.swapAt(numbers.startIndex, numbers.endIndex - 1)
print(numbers)
数组拼接
- 字符串数组拼接
- joined() 拼接字符串数组里的所有元素,为一个字符串
- joined(separator:) 以给定的分隔符,拼接字符串数组里的所有元素,为一个字符串
let array = ["hello", "world"]
print(array.joined())
print(array.joined(separator: ","))
- 元素为 Sequence 数组的拼接
- joined() 拼接数组里的所有元素为一个更大的 Sequence
- joined(separator:) 以给定的分隔符,拼接数组里的所有元素为一个更大的 Sequence
let ranges = [0...3, 8...10, 15...17]
for range in ranges {
print(range)
}
for index in ranges.joined() { //拼接获取range 的每一个值
print(index)
}
let nestedNumbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let joined = nestedNumbers.joined(separator: [-1, -2])
print(nestedNumbers)
print(Array(joined))