數(shù)組的創(chuàng)建
- 字面量創(chuàng)建
- 可以使用數(shù)組字面量來(lái)初始化一個(gè)數(shù)組,它是一種以數(shù)組集合來(lái)寫(xiě)一個(gè),或者多個(gè)值的簡(jiǎn)寫(xiě)方式,數(shù)組字面量寫(xiě)作一系列的值,用都好分隔,用方括號(hào)括起來(lái)
- 創(chuàng)建空數(shù)組的時(shí)候必須攜帶類(lèi)型信息
- 如果內(nèi)容已經(jīng)提供了類(lèi)型信息,你可以通過(guò)空數(shù)組字面量來(lái)創(chuàng)建一個(gè)空數(shù)組
var array = [1, 2, 3, 4]
array = []
let arr:[Int] = []
let arr2 = [Int]()
let arr3: Array<Int> = []
- 初始化器
- 初始化器有兩種方式 1.類(lèi)型 2.Array<類(lèi)型>()
var myArray = [String]()
var myArray2 = Array<String>()
2.初始器參數(shù)
- 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)
數(shù)組的遍歷和索引(訪問(wèn)和操作數(shù)組)
- 數(shù)組遍歷
- For-in
let numbers = [Int](1...7)
for index in numbers {
print(index)
}
- forEach 方法
- 無(wú)法使用 break 或 continue 跳出或者跳過(guò)循環(huán)
- 使用 return 只能退出當(dāng)前一次循環(huán)的執(zhí)行體
let numbers = [Int](0...7)
numbers.forEach { (num) in
if num == 3 {
return
}
print(num * 10)
}
3.同時(shí)得到索引和值 enumerated()
let numbers = [Int](1...7)
for (index, num) in numbers.enumerated() { //拆包
print("the index is \(index)")
print(num * 10)
}
4.使用 Iterator 遍歷數(shù)組
let numbers = [Int](1...7)
var numIterator = numbers.makeIterator() //迭代器
while let num = numIterator.next() {
print(num * 10)
}
- 數(shù)組索引
- starIndex 返回第一個(gè)元素的位置,對(duì)于數(shù)組來(lái)說(shuō),永遠(yuǎn)都是0
- endIndex 返回最后一個(gè)元素索引 +1 的位置,對(duì)于數(shù)組來(lái)說(shuō),等同于 count
- 如果數(shù)組為空,startIndex 等于 endIndex
- indices 獲取數(shù)組的索引區(qū)間
let numbers = [Int](1...7)
for i in numbers.indices {
print(numbers[i] * 10)
}
數(shù)組訪問(wèn)和操作(查找操作)
- 判斷是否包含指定元素
- contains(_:) 判斷數(shù)組是否包含給定元素
- contains(where:) 判斷數(shù)組是否包含符合給定條件的元素
let numbers = [Int](5...10)
print(numbers.contains(5))
print(numbers.contains(where: { $0 > 9 }))
- 判斷所有元素符合某個(gè)條件
- allSatisfy(_:) 判斷數(shù)組的每一個(gè)元素都符合給定的條件
let numbers = [Int](5...10)
print(numbers.allSatisfy({ $0 > 7}))
print(numbers.allSatisfy({ $0 > 4}))
- 查找元素
- first 返回?cái)?shù)組第一個(gè)元素 (Optional), 如果數(shù)組為空, 返回nil
- last 返回?cái)?shù)組最后一個(gè)元素 (Optional), 如果數(shù)組為空,返回nil
- first(where:) 返回?cái)?shù)組第一個(gè)符合給定條件的元素 (Optional)
- last(where:) 返回?cái)?shù)組最后一個(gè)符合給定條件的元素 (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:) 返回給定的元素在數(shù)組中出現(xiàn)的第一個(gè)位置 (Optional)
- lastIndex(of:) 返回給定的元素在數(shù)組中出現(xiàn)的最后一個(gè)位置 (Optional)
var array = [10, 20, 30, 40, 30, 20, 10]
print(array.firstIndex(of: 30))
print(array.lastIndex(of: 20))
- firstIndex(where:) 返回符合條件的第一個(gè)元素的位置 (Optional)
- lastIndex(where:) 返回符合條件的最后一個(gè)元素的位置 (Optional)
var array = [10, 20, 30, 40, 30, 20, 10]
print(array.firstIndex(where: { $0 > 25 }))
print(array.lastIndex(where: { $0 > 25 }))
- 查找最大最小元素
- min() 返回?cái)?shù)組中最小的元素
- max() 返回?cái)?shù)組中最大的元素
- min(by:) 利用給定的方式比較元素,并返回?cái)?shù)組的最小元素
- max(by:) 利用給定的方式比較元素,并放回?cái)?shù)組的最大元素
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 }))
數(shù)組添加和刪除操作
- 在末尾添加
- append(:) 在末尾添加一個(gè)元素
var numbers = [Int](2...7)
numbers.append(100)
print(numbers)
- append(contentsOf:)在末尾添加多個(gè)元素
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:) 在指定位置插入多個(gè)元素
var numbers = [Int](2...7)
numbers.insert(contentsOf: 100...105, at: 1)
print(numbers)
3.字符串也是 Collection, Element 是 Character 類(lèi)型
var chars: [Character] = ["a", "b", "c"]
chars.insert(contentsOf: "hello", at: 0)
print(chars)
- 移除單個(gè)元素
- remove(at:) 移除并返回指定位置的一個(gè)元素
var numbers = [Int](2...7)
let removeNum = numbers.remove(at: 1)
print(removeNum)
print(numbers)
- removeFirst() 移除并返回?cái)?shù)組的第一個(gè)元素
var numbers = [Int](2...7)
let num = numbers.removeFirst() //不能為空數(shù)組
print(num)
print(numbers)
- removeLast() 移除并返回?cái)?shù)組的最后一個(gè)元素
var numbers = [Int](2...7)
let endNum = numbers.removeLast() //不能為空數(shù)組
print(endNum)
print(numbers)
- popFirst() 移除并返回?cái)?shù)組的第一個(gè)元素(optional), 數(shù)組為空返回nil
let popNum = numbers.popLast() //可為空數(shù)組
print(popNum)
print(numbers)
- 移除多個(gè)元素
- removeFirst(:) 移除數(shù)組前面多個(gè)元素
var numbers = [Int](2...7)
numbers.removeFirst()
print(numbers)
numbers.removeFirst(2) //從開(kāi)始移除的個(gè)數(shù)
print(numbers)
- removeLast(:) 移除數(shù)組后面多個(gè)元素
var numbers = [Int](2...7)
numbers.removeLast()
print(numbers)
numbers.removeLast(2) //從末尾移除的個(gè)數(shù)
print(numbers)
- removeSubrange(:) 移除數(shù)組中給定范圍的元素
numbers.removeSubrange(1...3)
print(numbers)
- removeAll() 移除數(shù)組所有元素
numbers.removeAll()
print(numbers)
print(numbers.capacity)
- removeAll(keepingCapacity:) 移除數(shù)組所有元素,保留數(shù)組容量(如果移除之后重新添加,建議保留數(shù)組容量)
numbers.removeAll(keepingCapacity: true)
print(numbers)
print(numbers.capacity)
ArraySlice(數(shù)組切片)
- 移除多個(gè)元素
- ArraySlice 是數(shù)組或者其他 ArraySlice 的一段連續(xù)切片,和原數(shù)組共享內(nèi)存。
- 當(dāng)要改變 ArraySlice 的時(shí)候,ArraySlice 會(huì) copy 出來(lái),形成單獨(dú)的內(nèi)存
- ArraySlice擁有和 Array 基本完全類(lèi)似的方法
- 通過(guò) Drop 得到 ArraySlice
- dropFirst(:) 移除原數(shù)組前面指定個(gè)數(shù)的元素,得到一個(gè) ArraySlice
- dropLast(:) 移除原數(shù)組后面指定個(gè)數(shù)的元素,得到一個(gè) ArraySlice
- drop(:) 移除原數(shù)組符合指定條件的元素得到一個(gè) 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 }))
- 通過(guò) prefix 得到 ArraySlice
- prefix() 獲取數(shù)組前面指定個(gè)數(shù)的元素組成的 ArraySlice
- prefix(upTo:) 獲取數(shù)組到指定位置 (不包含指定位置) 前面的元素組成的 ArraySlice
- prefix(through:) 獲取數(shù)組到指定位置 (包含指定位置) 前面的元素組成的 ArraySlice
- prefix(while:) 獲取數(shù)組前面符合條件的元素 (到第一個(gè)不符合條件的元素截止) 組成的 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 }))
- 通過(guò) suffix 得到 ArraySlice
- suffix() 獲取數(shù)組后面指定個(gè)數(shù)的元素組成的 ArraySlice
- suffix(from:) 獲取數(shù)組從指定位置到結(jié)尾 (包含指定位置) 的元素組成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers.suffix(3))
print(numbers.suffix(from: 5))
- 通過(guò) Range 得到 ArraySlice
- 可以通過(guò)對(duì)數(shù)組下標(biāo)指定 Range 獲取 ArraySlice,可以使用閉區(qū)間、半開(kāi)半閉區(qū)間、單側(cè)區(qū)間、甚至可以只是用...來(lái)獲取整個(gè)數(shù)組組成的 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 轉(zhuǎn)為 Array
- ArraySlice 無(wú)法直接賦值給一個(gè) Array 的常量或變量,需要使用 Array(slice)
var numbers = [Int](1...9)
let slice = numbers[3...5]
numbers = Array(slice)
print(numbers)
- ArraySlice 和原 Array 相互獨(dú)立
- ArraySlice 和原 Array 相互獨(dú)立的,他們添加刪除元素不會(huì)影響對(duì)方
var numbers = [Int](1...3)
var slice = numbers.dropLast()
numbers.append(4)
print(slice)
print(numbers)
slice.append(5)
print(slice)
print(numbers)
數(shù)組重排
- 數(shù)組元素的隨機(jī)化
- shuffle() 在原數(shù)組上將數(shù)組元素打亂,只能作用在數(shù)組變量上
- shuffled() 返回原數(shù)組的隨機(jī)化數(shù)組, 可以作用在數(shù)組常量和變量上,并不改變?cè)瓟?shù)組
var numbers = [Int](0...9) //隨機(jī)播放
numbers.shuffle()
print(numbers)
let array = [Int](0...9)
var arr = array.shuffled()
print(arr)
print(array)
- 數(shù)組的逆序
- reverse() 在原數(shù)組上將數(shù)組逆序,只能作用在數(shù)組變量上
- reversed() 返回原數(shù)組的逆序“集合表示”,可以作用在數(shù)組變量和常量上,該方法不會(huì)重新分配新內(nèi)存空間
var numbers = [Int](0...9)
numbers.reverse()
print(numbers)
let array = [Int](0...9)
var arr = array.reversed()
print(arr) //共享內(nèi)存
print(array)
for index in arr {
print(index)
}
- 數(shù)組的分組
- partition(by belongsInSecondPartition:(Element) throws -> Bool) 將數(shù)組以某個(gè)條件分組,數(shù)組前半部分都是不符合條件的元素,數(shù)組后半部分都是符合條件的元素
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)
- 數(shù)組的排序
- sort() 在原數(shù)組上將元素排序,只能組用于數(shù)組變量。
- sorted() 返回原數(shù)組的排序結(jié)果數(shù)組,可以作用在數(shù)組變量和常量上
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)
- 交換數(shù)組兩個(gè)元素
- swapAt(::) 交換指定位置的兩個(gè)元素
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
numbers.swapAt(numbers.startIndex, numbers.endIndex - 1)
print(numbers)
數(shù)組拼接
- 字符串?dāng)?shù)組拼接
- joined() 拼接字符串?dāng)?shù)組里的所有元素,為一個(gè)字符串
- joined(separator:) 以給定的分隔符,拼接字符串?dāng)?shù)組里的所有元素,為一個(gè)字符串
let array = ["hello", "world"]
print(array.joined())
print(array.joined(separator: ","))
- 元素為 Sequence 數(shù)組的拼接
- joined() 拼接數(shù)組里的所有元素為一個(gè)更大的 Sequence
- joined(separator:) 以給定的分隔符,拼接數(shù)組里的所有元素為一個(gè)更大的 Sequence
let ranges = [0...3, 8...10, 15...17]
for range in ranges {
print(range)
}
for index in ranges.joined() { //拼接獲取range 的每一個(gè)值
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))