目录
3.2 allSatisfy(_:) 判断数组的每一个元素都符合给定的条件
0 绪论
今天来学习一下swifi的数组,废话不说,直接撸代码吧。
1 数组的创建和初始化
let array = [1,2,3,4]
let array = [Int](1...4)
var array: [String] = []
var array = [String]()
let chars = Array("welcome")
print(chars)
let numbers = Array(1...20)
print(numbers)
let chars = Array(repeating: "AI", count: 5)
print(chars)
/**
输出结果如下:
["w", "e", "l", "c", "o", "m", "e"]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
["AI", "AI", "AI", "AI", "AI"]
*/
2.数组遍历
2.1通过键值对遍历
let students = ["zhangsan": 15,"lisi": 16,"wangwu": 17]
let names = Array(students.keys)
let ages = Array(students.values)
print(names)
print(ages)
/**
输出结果如下:
["zhangsan", "wangwu", "lisi"]
[15, 17, 16]
*/
2.2 通过forEach遍历
let numbers = [Int](0...4)
numbers.forEach{ (num) in
if num == 3{
//此处不能使用 continue ,break关键字,使用return也只能退出当次循环
return
}
print(num)
}
/**
输出结果如下:
0
1
2
4
*/
2.3 通过for in遍历
2.3.1 for in 搭配 enumerated
var numbers = [Int](0...5)
for(index,num)in numbers.enumerated(){
//同时得到索引和值 enumerated()
print("the index is: \(index),the value is \(num)")
if num == 3 {
//此处能使用 break关键字
}
}
/**
输出结果如下:
the index is: 1,the value is 1
the index is: 2,the value is 2
the index is: 3,the value is 3
the index is: 4,the value is 4
the index is: 5,the value is 5
*/
2.3.2 for in的另一种形式
var numbers = [Int](2...6)
for i in 0..<numbers.count{
print("the index is: \(i),the valuse is: \(numbers[i])")
}
/**
输出结果如下:
the index is: 0,the valuse is: 2
the index is: 1,the valuse is: 3
the index is: 2,the valuse is: 4
the index is: 3,the valuse is: 5
the index is: 4,the valuse is: 6
*/
2.3.2 for in 搭配 indices
- for in 的另一种形式 (索引 indices)
- startIndex 返回第一个元素的位置,对于数组来说,永远都是 0。
- endIndex 返回最后一个元素索引 +1 的位置,对于数组来说,等同于count 。 如果数组为空,startIndex 等于 endIndex 。
var numbers = [Int](2...6)
for i in numbers.indices{
print("the index is: \(i),the valuse is: \(numbers[i])")
}
/**
输出结果如下:
the index is: 0,the valuse is: 2
the index is: 1,the valuse is: 3
the index is: 2,the valuse is: 4
the index is: 3,the valuse is: 5
the index is: 4,the valuse is: 6
*/
2.4 通过Iterator遍历器遍历
- 使用 Iterator 遍历数组
let numbers = [Int](0...6)
var numIterator = numbers.makeIterator()
while let num = numIterator.next(){
print("the value is: \(num)")
}
/**
输出结果如下:
the value is: 2
the value is: 3
the value is: 4
the value is: 5
the value is: 6
*/
3 数组的操作
3.1 contains 判断数组包含元素
- contains(_:) 判断数组是否包含给定元素
- contains(where:) 判断数组是否包含符合给定条件的元素
let array = [56,42,30,8,63,89,102,6,19,27,34]
print(array.contains(63))
print(array.contains(where: {$0 > 100}))
/**
输出结果如下:
true
true
*/
3.2 allSatisfy(_:) 判断数组的每一个元素都符合给定的条件
let array = [Int](0...10)
print(array.allSatisfy({ $0 > 5}))
print(array.allSatisfy({$0 < 10}))
/**
输出结果如下:
false
false
*/
4.查找比较
4.1 数组查找
- first 返回数组第一个元素(optional),如果数组为空,返回 nil 。
- last 返回数组最后一个元素(optional),如果数组为空,返回 nil 。
- first(where:)返回数组第一个符合给定条件的元素(optional)。
- last(where:) 返回数组最后一个符合给定条件的元素(optional)。
let array = [12,56,48,69,120,3,7,59,25,56,75]
print(array.first)
print(array.last)
print(array.first(where: { $0 > 45}))
print(array.last(where: { $0 > 45}))
/**
输出结果如下:
Optional(12)
Optional(75)
Optional(56)
Optional(75)
*/
- firstIndex(of:) 返回给定的元素在数组中出现的第一个位置(optional)
- lastIndex(of:) 返回给定的元素在数组中出现的最后一个位置(optional)
- firstIndex(where:) 返回符合条件的第一个元素的位置(optional)
- lastIndex(where:) 返回符合条件的最后一个元素的位置(optional)
let array = [12,56,48,69,120,3,7,59,25,56,75]
print(array.firstIndex(of: 56))
print(array.lastIndex(of: 56))
print(array.firstIndex(where: { $0 > 45}))
print(array.lastIndex(where: { $0 > 45}))
/**
输出结果如下:
Optional(1)
Optional(9)
Optional(1)
Optional(10)
*/
4.1 数组比较大小 min ,max
- min() 返回数组中最小的元素
- max() 返回数组中最大的元素
- min(by:) 利用给定的方式比较元素并返回数组中的最小元素
- max(by:) 利用给定的方式比较元素并返回数组中的最大元素
let array = [12,56,48,69,120,3,7,59,25,56,75]
print(array.min())
print(array.max())
/**
输出结果如下:
Optional(3)
Optional(120)
*/
let array = [("zhangsan",26),("lisi",56)]
print(array.min(by: {a,b in a.1 > b.1 }))
print(array.max(by: {a,b in a.1 > b.1}))
/**
输出结果如下:
Optional(("lisi", 56))
Optional(("zhangsan", 26))
*/
4.2在参数多个的时候对数组查找
let array = [("zhangsan",26),("lisi",56),("wagnwu",32),("niuli",105)]
print(array.min(by: {(a,b) -> Bool in
a.1 < b.1
}))
print(array.max(by: {(a,b) -> Bool in
a.1 < b.1
}))
/**
输出结果如下:
Optional(("zhangsan", 26))
Optional(("niuli", 105))
*/
5 数组添加删除操作
5.1append插入元素
- append(_:) 在末尾添加一个元素
- append(contentsOf: ) 在末尾添加多个元素
var array = [Int](1...5)
array.append(15)
print(array)
array.append(contentsOf: 8...15)
print(array)
/**
输出结果如下:
[1, 2, 3, 4, 5, 15]
[1, 2, 3, 4, 5, 15, 8, 9, 10, 11, 12, 13, 14, 15]
*/
5.2 insert 插入元素
- insert(_:at:) 在指定的位置插入一个元素
- insert(contentsOf: at:) 在指定位置插入多个元素
var array = [Int](1...5)
array.insert(200, at: 2)
print(array)
array.insert(contentsOf: -9...(-1), at: 0)
print(array)
/**
输出结果如下:
[1, 2, 200, 3, 4, 5]
[-9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 200, 3, 4, 5]
*/
5.3 remove移除元素
- remove(at:) 移除并返回指定位置的一个元素
- removeFirst() 移除并返回数组的第一个元素(移除数组前面多个元素)
- removeLast() 移除并返回数组的最后一个元素(移除数组后面多个元素)
- popLast() 移除并返回数组的最后一个元素(optional),如果数组为空返回nil 。
- removeSubrange(_:) 移除数组中给定范围的元素。
- removeAll() 移除数组所有元素。
- removeAll(keepingCapacity:) 移除数组所有元素,保留数组容量
var chars: [Character] = ["a","b","c","d","e"]
chars.insert(contentsOf: "nihao", at: 0)
print(chars)
let removeChar = chars.remove(at: 1)
print(removeChar)
print(chars)
/**
输出结果如下:
["n", "i", "h", "a", "o", "a", "b", "c", "d", "e"]
i
["n", "h", "a", "o", "a", "b", "c", "d", "e"]
*/
var chars: [Character] = ["a","b","c","d","e"]
chars.insert(contentsOf: "welcome", at: 0)
print(chars)
let removeChar2 = chars.removeFirst()
print(removeChar2)
print(chars)
let removeChar = chars.removeLast()
print(removeChar)
print(chars)
chars.removeSubrange(1...3)
print(chars)
let removeNum = chars.popLast()
print(chars)
print(removeNum)
/**
输出结果如下:
["w", "e", "l", "c", "o", "m", "e", "a", "b", "c", "d", "e"]
w
["e", "l", "c", "o", "m", "e", "a", "b", "c", "d", "e"]
e
["e", "l", "c", "o", "m", "e", "a", "b", "c", "d"]
["e", "m", "e", "a", "b", "c", "d"]
["e", "m", "e", "a", "b", "c"]
Optional("d")
*/
var chars: [Character] = ["a","b","c","d","e"]
chars.removeAll()
print(chars)
print(chars.capacity)
var chars2: [Character] = ["a","b","c","d","e"]
chars2.removeAll(keepingCapacity: true)
print(chars2)
print(chars2.capacity)
/**
输出结果如下:
[]
0
[]
5
*/
5.4 移除多个元素(ArraySlice)
5.4.1 通过 Drop 得到 ArraySlice
- ArraySlice 是数组或者其他ArraySlice 的一段连续切片,和原数组共享内存。 当要改变 ArraySlice 的时候,ArraySlice 会 copy 出来,形成单独内存。 ArraySlice 拥有和 Array 基本完全类似的方法。
- dropFirst(:) “移除”原数组前面指定个数的元素得到一个 ArraySlice。
- dropLast(:) “移除”原数组后面指定个数的元素得到一个 ArraySlice。
- drop(:) “移除”原数组符合指定条件的元素得到一个 ArraySlice。
let array = [5,2,10,1,0,100,46,99]
print(array)
print(array.dropFirst())
print(array.dropFirst(3))
print(array.dropLast())
print(array.dropLast(3))
print(array.drop{ $0 < 15})
/**
输出结果如下:
[5, 2, 10, 1, 0, 100, 46, 99]
[2, 10, 1, 0, 100, 46, 99]
[1, 0, 100, 46, 99]
[5, 2, 10, 1, 0, 100, 46]
[5, 2, 10, 1, 0]
[100, 46, 99]
*/
5.4.2 通过 prefix 得到 ArraySlice
- prefix() 获取数组前面指定个数的元素组成的 ArraySlice。
- prefix(upTo: ) 获取数组到指定位置(不包含指定位置)前面的元素组成的 ArraySlice。
- prefix(through: ) 获取数组到指定位置(包含指定位置)前面的元素组成的 ArraySlice。
- prefix(while: ) 获取数组前面符合条件的元素(到第一个不符合条件的元素截止)组成的 ArraySlice。
let array = [5,2,10,1,0,100,46,99]
print(array.prefix(4))
print(array.prefix(upTo: 4))
print(array.prefix(through: 4))
print(array.prefix{ $0 < 10})
/**
输出结果如下:
[5, 2, 10, 1]
[5, 2, 10, 1]
[5, 2, 10, 1, 0]
[5, 2]
*/
5.4.3 通过 suffix 得到 ArraySlice
- suffix() 获取数组后面指定个数的元素组成的 ArraySlice。
- suffix(from: ) 获取数组从指定位置到结尾(包含指定位置)的元素组成的 ArraySlice。
let array = [5,2,10,1,0,100,46,99]
print(array.suffix(3))
print(array.suffix(from: 5))
/**
输出结果如下:
[100, 46, 99]
[100, 46, 99]
*/
5.4.4 通过 Range 得到 ArraySlice
-
可以通过对数组下标指定 Range 获取 ArraySlice,可以使用闭区间、半开半闭区间、单侧区 间、甚至可以只使用 ... 来获取整个数组组成的 ArraySlice 。
let array = [5,2,10,1,0,100,46,99]
print(array[3...5])
print(array[3..<5])
print(array[...2])
print(array[..<2])
print(array[6...])
print(array[...])
/**
输出结果如下:
[1, 0, 100]
[1, 0]
[5, 2, 10]
[5, 2]
[46, 99]
[5, 2, 10, 1, 0, 100, 46, 99]
*/
5.5 ArraySlice 转为 Array
- ArraySlice 无法直接赋值给一个 Array 的常量或变量,需要使用 Array(slice) 。
let array = [5,2,10,1,0,100,46,99]
let slice = array[3...5]
var arrayNew = Array(slice)
5.6 ArraySlice 和原 Array 相互独立
- ArraySlice 和原 Array 是相互独立的,它们添加删除元素不会影响对方
6 数组排序
6.1 随机打乱数组顺序
- shuffle() 在原数组上将数组元素打乱,只能作用在数组变量上。
- shuffled() 返回原数组的随机化数组,可以作用在数组变量和常量上。
var array = [Int](0...20)
var arrayShu = array.shuffled()
print(array)
print(arrayShu)
/**
输出结果如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[17, 13, 2, 0, 1, 12, 15, 5, 10, 3, 11, 6, 18, 8, 16, 7, 19, 4, 14, 9, 20]
*/
6.2 数组倒序
- reverse() 在原数组上将数组逆序,只能作用在数组变量上。
- reversed() 返回原数组的逆序“集合表示”,可以作用在数组变量和常量上,该方法不 会分配新内存空间。
var array = [Int](0...20)
print(array)
array.reverse()
print(array)
/**
输出结果如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
*/
6.3数组的分组
- partition(by belongsInSecondPartition: (Element) throws -> Bool) 将数组以某个 条件分组,数组前半部分都是不符合条件的元素,数组后半部分都是符合条件的元素。
var array = [Int](0...20)
var arrayShu = array.shuffled()
print(array)
let index = arrayShu.partition { (element) -> Bool
in
element > 10
}
print(arrayShu)
let partition1 = arrayShu[..<index]
let partition2 = arrayShu[index...]
print(partition1)
print(partition2)
/**
输出结果如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[7, 9, 3, 10, 5, 1, 0, 8, 2, 4, 6, 13, 12, 17, 16, 20, 18, 15, 19, 14, 11]
[7, 9, 3, 10, 5, 1, 0, 8, 2, 4, 6]
[13, 12, 17, 16, 20, 18, 15, 19, 14, 11]
*/
6.4 数组的顺序排序
-
sort() 在原数组上将元素排序,只能作用于数组变量。
- sorted() 返回原数组的排序结果数组,可以作用在数组变量和常量上。
var array = [Int](0...20)
var arrayShu = array.shuffled()
print(array)
print(arrayShu)
print(arrayShu.sorted())
/**
输出结果如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[3, 19, 12, 13, 1, 10, 20, 16, 18, 9, 11, 17, 5, 0, 14, 8, 2, 6, 7, 4, 15]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
*/
6.5数组元素交换位置
- swapAt(_:_:) 交换指定位置的两个元素。
var array = [Int](0...20)
print(array)
array.swapAt(array.startIndex, array.endIndex - 1)
print(array)
/**
输出结果如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0]
*/
7 数组的拼接
7.1 字符串数组拼接
- joined() 拼接字符串数组里的所有元素为一个字符串。
- joined(separator:) 以给定的分隔符拼接字符串数组里的所有元素为一个字符串。
var array = ["welcome","shenzhen"]
print(array.joined())
print(array.joined(separator: ","))
/**
输出结果如下:
welcomeshenzhen
welcome,shenzhen
*/
7.2元素为 Sequence 数组的拼接
- joined() 拼接数组里的所有元素为一个更大的 Sequence。
- joined(separator:) 以给定的分隔符拼接数组里的所有元素为一个更大的 Sequence。
let ranges = [0...3,8...15,18...26]
for range in ranges{
print(range)
}
/**
输出结果如下:
0...3
8...15
18...26
*/
let array = [[1...3,5...6],[8...9,19...23],[10...15,28...30,35...40]]
let joined = array.joined(separator: [-1...0])
print(Array(joined))
/**
输出结果如下:
[ClosedRange(1...3), ClosedRange(5...6), ClosedRange(-1...0), ClosedRange(8...9), ClosedRange(19...23), ClosedRange(-1...0), ClosedRange(10...15), ClosedRange(28...30), ClosedRange(35...40)]
*/
for i in ranges.joined(){
print(i)
}
/**
输出结果如下:
0
1
2
3
8
9
10
11
12
13
14
15
18
19
20
21
22
23
24
25
26
*/
8 总结
暂时还没没写总结。