- 字面量创建数组
- 可以使用数组字面量来初始化一个数组,它是一种以数组集合来写一个或者多个值的简写方式。数组字面量写做一系列的值,用逗号隔开,用方括号括起来。
- 创建空数组的时候必须携带类型信息。
- 如果内容已经提供了类型信息。比如说作为函数的实际参数或者已经分类了的变量或常量,你可以通过空数组字面量来创建一个数组。
- 使用初始化器创建数组
- [类型]()
- Array<类型>()
- 使用Array(repeateding:count:)创建数组
- 数组遍历
- for - in 遍历
- forEach遍历
- 无法使用break或continue跳出或者跳出循环。
- 使用return只能退出当前一次循环的执行体。
- 同时得到索引和值 enumerated()遍历
- 使用lterator(迭代器)遍历
- 索引
- starIndex 返回第一个元素的位置,对于数组来说,永远都是0。
- endIndex 返回最后一个元素索引+1的位置,对于数组来说,等同于count。
- 如果数组为空,startIndex等于endIndex。
- Indices 获取数组的索引区间。
- 【代码演示】
//1、字面量创建 var arry:[Int] = [1,2,3] print(arry) arry = [] arry.append(2) print(arry)//2、Array(repeateding:count:) let fiveZs = Array(repeating: "z", count: 5) print(fiveZs)//结果:[z、z、z、z、z] //3、其他 let numbers = [Int](0...7) print(numbers)//结果:[0、1、2、3、4、5、6、7] let persons = ["zhangsan":27,"lisi":25,"wangwu":29] let names = [String](persons.keys) print(names)//结果:["wangwu", "zhangsan", "lisi"] ///数组遍历 //1、for-in let nickName:[String] = ["小明","小杰","小张"]for item in nickName {print(item)//结果:小明 小杰 小张 }//2、forEach let agesArray = [Int](0...7) agesArray.forEach { (age) inprint(age * 10)//结果:0 10 20 30 40 50 60 70 }//3、enmerated()let appleIndex = [Int](2...7) for (index,num) in appleIndex.enumerated() {print("index is \(index), appleIndex is \(num)") }/** 结果index is 0, appleIndex is 2index is 1, appleIndex is 3index is 2, appleIndex is 4index is 3, appleIndex is 5index is 4, appleIndex is 6index is 5, appleIndex is 7*///4、Iterator let computers = [Int](2...7)var computersIterator = computers.makeIterator() while let num = computersIterator.next() {print(num)//结果:2、3、4、5、6、7 }//5、indices let indicesTest = [Int](2...7)for i in indicesTest.indices{print(indicesTest[i])//结果:2、3、4、5、6、7 } - 判断是否包含指定元素。
- Contains(_:)判断是否包含给定元素。
- Contains(where:)判断数组是否包含符合给定条件的元素。
- 判断所有元素符合某个条件。
- allSatisfy(_:)判断数组的每一个元素都符合给定的条件。
- 查找元素
- first返回数组第一个元素(optional),如果数组为空,返回nil。
- last返回数组最后一个元素(optional),如果数组为空,返回nil。
- First(where:)返回数组第一个符合给定调剂的元素(optional)。
- Last(where:)返回数组最后一个符合给定条件的元素(optional)。
- 查找索引。
- firstIndex(of:)返回给定的元素在数组中出现的第一个位置(optional)。
- lastIndex(of:)返回给定元素在数组中出现的最后一个位置(optional)。
- firstIndex(where:)返回符合条件第一个位置(optional)。
- lastIndex(where:)返回符合条件最后一个位置(optional)。
- 查找最大最小元素
- Min()返回数组最小的元素。
- Max()返回数组中最大的元素。
- Mind(by:)利用给定的方式比较元素并返回数组中的最小元素。
- Max(by:)利用给定的方式比较元素并返回数组中的最发元素。
- 【代码演示】???????
//6、contains() contains(where:) let containsArray = [10,20,30,45,98,101,30,4] print(containsArray.contains(30))//结果:true print(containsArray.contains(where :{$0 < 3 }))//结果:false//7、first last first(where:) let intArray = [10,20,30,45,98,101,30,4] print(intArray.first)//结果:Optional(10) print(intArray.last)//结果:Optional(4) print(intArray.first(where:{$0 > 30 }))//结果:Optional(45) print(intArray.last(where:{$0 > 30}))//结果:Optional(101)//8、firstIndex(of:) 、lasttIndex(of:)、firstIndex(where:) 、lastIndex(where:)print(intArray.firstIndex(of: 9))//结果:nil print(intArray.lastIndex(of: 30))//结果:Optional(6) print(intArray.firstIndex(where: {$0 > 30}))//结果:Optional(3) print(intArray.lastIndex(where: {$0 > 30}))//结果:Optional(5)//9、min() max()print(intArray.min())//结果:Optional(4) print(intArray.max())//结果:Optional(101)let errors = [(12,"error12"),(23,"error23"),(34,"error35"),(12,"error12")]print(errors.min(by: {(a,b) -> Bool ina.1 < b.1 }))//结果:Optional((12, "error12")) - 在末尾添加元素。
- Append(_:)在末尾添加一个元素。
- Append(contentsOf:)在末尾添加多个元素。
- 在任意位置插入。
- Insert(_:at:)在指定位置插入一个元素。
- Insert(contensOf:at:)在指定位置插入多个元素。
- 字符串也是collection
- 字符串也是collection,element是character类型。
- 移除单个元素
- Remove(at:)移除并返回指定位置的一个元素。
- removeFirst()移除并返回数组的第一个元素。
- popFirst(()移除并返回数组的第一个元素(optional),数组为空返回nil。
- 移除多个元素
- removeFirst(:)移除数组前面多个元素。
- removeLast(:)移除数组后面多个元素。
- removeSubrange(_:)移除数组中给定范围的元素。
- removeAll()移除数组所有元素。
- removeAll(keepingCapacity)移除数组所有元素,保留数组容量。
- 【代码演示】
//10、在末尾添加元素 var foodsArray = [Int](2...7) foodsArray.append(100) print(foodsArray)//结果:[2, 3, 4, 5, 6, 7, 100] foodsArray.append(contentsOf: 100...105) print(foodsArray)//结果:[2, 3, 4, 5, 6, 7, 100, 100, 101, 102, 103, 104, 105]//11、在任意位置插入元素 var inserArray = [Int](2...7) inserArray.insert(-1, at: 0) print(inserArray)//结果:[-1, 2, 3, 4, 5, 6, 7] inserArray.insert(contentsOf: 8...10, at: 0) print(inserArray)//结果:[8, 9, 10, -1, 2, 3, 4, 5, 6, 7] //12、字符串也是collection var chars:[Character] = ["a","b","c"] chars.insert(contentsOf: "hellow", at: 0) print(chars)//结果:["h", "e", "l", "l", "o", "w", "a", "b", "c"] //13、移除单个数组 var charNumArray:[Character] = ["a","b","c","d"] let removedChar = charNumArray.remove(at: 1) print(removedChar)//结果:b print(charNumArray)//结果:["a", "c", "d"] let remmovedNewChar = charNumArray.removeFirst() print(remmovedNewChar)//结果:b print(charNumArray)//结果:["c", "d"] //14、移除多个数组 var charSubNumArray:[Character] = ["a","b","c","d","e"] charSubNumArray.removeFirst(2) print(charSubNumArray)//结果:["c", "d","e"] charSubNumArray.removeLast(2) print(charSubNumArray)//结果:["c"]var charNewSubNumArray:[Character] = ["a","b","c","d","e"] charNewSubNumArray.removeSubrange(1...2) print(charNewSubNumArray)//结果:["a", "d", "e"] charNewSubNumArray.removeAll(keepingCapacity: true)print(charNewSubNumArray)//结果:[] print(charNewSubNumArray.capacity)//结果:5 - 数组切片ArraySlice
- ArraySlice 是数组或者其他ArraySlice 的一段连续切片,和原数组共享内存。
- 当要改变ArraySlice 的时候,ArraySlice 会copy出来,形成单独的内存。
- ArraySlice拥有和array基本完全类似的方法。
- 通过Drop得到ArraySlice
- dropFirst(:) 移除原数组前面指定个数的元素得到一个ArraySlice。
- dropLast(:) 移除原数组后面指定个数的元素得到一个ArraySlice。
- Drop(:) 移除原数组符合指定条件的元素得到一个ArraySlice。
- 通过prefix得到ArraySlice
- Prefix()获取数组前面指定个数的元素组成的ArraySlice 。
- Prefix(upTo:)获取数组到指定位置(不包含指定位置)前面的元素组成的ArraySlice 。
- Prefix(through:)获取数组到指定位置(包含指定位置)前面的元素组成的ArraySlice 。
- Prefix(while:)获取数组前面符合条件的元素(到第一个不符合条件的元素截止)组成ArraySlice。
- 通过suffix得到ArraySlice
- Suffix()获取数组后面指定个数的元组组成的ArraySlice。
- 通过range得到ArraySlice
- 可以通过对数组下标指定range获取ArraySlice,可以使用闭区间、半开半闭区间、单侧区间、甚至可以只使用...来获取整个数组组成的ArraySlice。
- ArraySlice转为数组
- ArraySlice无法直接赋值给一个array的常量或变量,需要使用Array(slice)。
- ArraySlice和原array相互独立
- ArraySlice和原array是相互独立的,它们添加删除不会影响对方。
- 【代码演示】
//15、通过Drop得到ArraySlice
let dropArrays = [5,2,10,1,0,100,46,99]
dropArrays.dropFirst()//结果:[2,10,1,0,100,46,99]
dropArrays.dropFirst(3)//结果:[0,100,46,99]
dropArrays.dropLast()//结果:[0,100,46]
dropArrays.dropLast(1)//结果:[0,100,46]
print("\(dropArrays.drop{ $0 < 60 })")//结果:[100, 46, 99]
print(dropArrays.dropLast(1))
//16、通过prefix得到ArraySlice
let prefixArrays = [5,2,10,1,0,100,46,99]
prefixArrays.prefix(4)//结果:[5, 2, 10, 1]
prefixArrays.prefix(upTo: 4)//结果:[5, 2, 10, 1]
prefixArrays.prefix(through: 4)//结果:[5, 2, 10, 1, 0]
prefixArrays.prefix(while: {$0 < 10 })//结果:[5, 2]
//17、通过suffix得到ArraySlice
let suffixArrays = [5,2,10,1,0,100,46,99]
suffixArrays.suffix(3)//结果:[100, 46, 99]
suffixArrays.suffix(from: 6)//结果:[46, 99]
//18、通过range得到ArraySlice
let rangeArrays = [5,2,10,1,0,100,46,99]
rangeArrays[3...5]//结果:[1、0,100]
rangeArrays[3..<5]//结果:[1、0]
rangeArrays[...2]//结果:[5、2、10]
rangeArrays[..<2]//结果:[5、2]
rangeArrays[6...]//结果:[46、99]
rangeArrays[...]//结果:[5,2,10,1,0,100,46,99]
//19、ArraySlice转为数组
var sliceArrays = [5,2,10,1,0,100,46,99]
let slice = sliceArrays[3...5]
sliceArrays = Array(slice)//结果:[1、0,100]//20、ArraySlice和原array相互独立
var arr = [10,46,99]
var sli = arr.dropLast()//[10, 46, 99]
arr.append(333)//[10, 46, 99, 333]
print(sli)//[10, 46]
sli.append(555)//[10, 46, 555]
print(arr)//[10, 46, 99, 333]
- 数组元素的随机化。
- Shuffle()在原数组上将数组元素打乱,只能作用在数组变量上。
- Shuffled()返回原素组的随机化数组,可以作用在数组变量和常量上。
- 数组的逆序。
- Reverse()在元数组上将数组逆序,只能作用在数组变量上。
- Reversed()返回原素组的逆序集合表示,可以作用在数组变量和常量上,该方法不会分配内存空间。
- 数组分组
- partition将数组以某个条件分组,数组前半部分都是不符合条件的元素,数组后半部分都是都是符合条件的元素。
- 【代码演示】
//21、数组元素的随机化 var shuffleVArray = [Int](1...8) shuffleVArray.shuffle()//结果:[2, 4, 8, 3, 1, 7, 6, 5] print(shuffleVArray)//结果:[2, 4, 8, 3, 1, 7, 6, 5] let shuffleLArray = [Int](1...8) shuffleVArray.shuffled()//结果:[4, 5, 3, 8, 1, 7, 6, 2] print(shuffleVArray)//结果:[2, 4, 8, 3, 1, 7, 6, 5] shuffleLArray.shuffled()//结果:[4, 2, 7, 3, 1, 6, 5, 8] print(shuffleLArray)//结果:[1, 2, 3, 4, 5, 6, 7, 8] //22、数组逆序 var reverseVArray = [Int](1...8) reverseVArray.reverse()//结果:[8, 7, 6, 5, 4, 3, 2, 1] print(reverseVArray)//结果:[8, 7, 6, 5, 4, 3, 2, 1] let reverseLArray = [Int](1...8) reverseLArray.reversed()//结果:ReversedCollection<Array<Int>> print(reverseLArray)//结果:"[1, 2, 3, 4, 5, 6, 7, 8] //23、数组的分组 partitionvar pArray = [10,20,45,30,98,101,30,4] let index = pArray.partition { (element) -> Boolinelement > 30 } print(pArray) let partition1 = pArray[..<index]//结果:[10, 20, 4, 30, 30] let partition2 = pArray[index...]//结果:[101, 98, 45] print(partition1)//结果:[10, 20, 4, 30, 30] print(partition2)//结果:[101, 98, 45] //24、数组排序var sortVArray = [10,20,45,30,98,101,30,4] sortVArray.sort()//结果:[4, 10, 20, 30, 30, 45, 98, 101] print(sortVArray)//结果:[4, 10, 20, 30, 30, 45, 98, 101] let sortLArray = [10,20,45,30,98,101,30,4] sortLArray.sorted()//结果:[4, 10, 20, 30, 30, 45, 98, 101] print(sortLArray)//结果: [10,20,45,30,98,101,30,4]sortVArray.sorted()//结果:[4, 10, 20, 30, 30, 45, 98, 101] print(sortVArray)//结果:[4, 10, 20, 30, 30, 45, 98, 101] //25、交换数组两个元素。 var swapArray = [10,20,45,30,98,101,30,4] swapArray.swapAt(swapArray.startIndex, swapArray.endIndex-1) print(swapArray)//[4, 20, 45, 30, 98, 101, 30, 10] - 字符串数组的拼接操作
- Joined()拼接字符串里的所有元素为一个字符串。
- Joined(separator:)以给定的分隔拼接字符串数组里的所有元素作为一个字符串。
- 元素为Sequence 数组的拼接。
- Joined()拼接数组里的所有元素为一个更大的sequence。
- Joined(separator:)以给定的分隔符拼接数组的所有元素为一个更大的sequence。
- 数组的协议结构
- Sequence--> collection-->rangereplaceablecollection-->array
- Sequence
- 一个序列(sequence)代表的是一系列具有相同类型的值,你可以对这些值进行迭代。
- IleratorPritocol
- sequence通过创建一个迭代器来提供对元素的访问。迭代器每次产生一个序列值,并且当遍历序列时对遍历状态进行管理。
- 当序列被耗尽时,next()应返回nil。
- Collection是满组以下两个条件的sequence。
- 稳定的sequence,能够被多次遍历且保持一致。
- 除了线性遍历以外,集合中的元素也可以通过下标索引的方式被获取到。
- 和sequence不同,collection类型不能是无限的。
- 【代码演示】
//26、字符串数组拼接 var joinArray = ["hellow","world"] print(joinArray.joined())//结果:hellowworld print(joinArray.joined(separator: ","))//结果:hellow,world //27、元素为Sequence 数组的拼接。 let joinRanges = [0...3,8...10,15...17] for range in joinRanges{print(range) } /**结果:0...38...1015...17*/ for range in joinRanges.joined(){print(range) } /** 0 1 2 3 8 9 10 15 16 17*/let nestedArray = [[1,2,3],[4,5,6],[7,8,9]] let nestedArrayResule = nestedArray.joined(separator: [0,0]) print(nestedArrayResule) /**结果JoinedSequence<Array<Array<Int>>>(_base: [[1, 2, 3], [4, 5, 6], [7, 8, 9]], _separator: ContiguousArray([0, 0]))*/ print(Array(nestedArrayResule)) /**转为结果:[1, 2, 3, 0, 0, 4, 5, 6, 0, 0, 7, 8, 9]*/ - Stack
- 栈是一种后入先出的数据结构,仅限定在栈顶进行插入或者删除操作。栈结构的实际应用主要有数制表、转换,括号匹配,表达式求值等等。
- Queue
- 队列在生活中非常常见。队列特点:先进先出(FIFO,first in first out),排在最前面的先出来,后面来的只能排在最后面。
- 【代码演示】
//27、模拟进出栈 struct Stack<T> {private var elements = [T]()var isEmpty : Bool{return elements.isEmpty}mutating func push(_ element:T) {elements.append(element)}mutating func pop () -> T? {return elements.popLast()} }var stack = Stack<Int>()stack.push(1) stack.push(6) stack.push(8) print(stack.pop() ?? 0)//27、模拟队列 struct Queue<T> { private var elelments = [T]()var count:Int {return elelments.count}var isEmpty:Bool {return elelments.isEmpty}mutating func enqueue(_ element: T) {elelments.append(element)}mutating func dequeue() -> T? {return isEmpty ? nil :elelments.removeFirst()} } var queue = Queue<Int>()queue.enqueue(1) queue.enqueue(6) queue.enqueue(8) print(queue.dequeue() ?? 0)