数组的声明
可变关键字用var,不可变关键字用let,默认用一对[]表示
let swift_arr = [1, 2, 3, 4]
或,如果没有用到的话可以直接用_表示变量名,变量类型部分swift内部会自动推断
_ = [0, 1, 1, 2, 3, 5]
swift数组拼接操作
var mutableFibs = [0, 1, 1, 2, 3, 5]
mutableFibs.append(8) //[0, 1, 1, 2, 3, 5, 8]
mutableFibs.append(contentsOf: [13, 21]) //[0, 1, 1, 2, 3, 5, 8, 13, 21]
print("mutableFibs:", mutableFibs) //[0, 1, 1, 2, 3, 5, 8, 13, 21]
swift的值拷贝和写时复制
swift内部对于数组重新赋值的时候,这个时候不会发生copy操作,仅当操作时才会进行把原来数组的值复制到新数组中
var x = [1, 2, 3]
let y = x
x.append(4)
print("x:", x) //x: [1, 2, 3, 4]
print("y:", y) //y: [1, 2, 3]
for in迭代
迭代除了第一个元素外的部分
for i in x.dropFirst() {
print("i", i)
}
//同时遍历下标和元素
for (num, element) in x.enumerated() {
print("num: element:", num, element)
}
//查找数组中元素首次出现的下标
let index = x.firstIndex(of: 2)
print("index:", index ?? -1)
print("index: \(index ?? -1)")
map形变
//对数组中元素进行形变,每个元素+2
let resultArr = x.map{$0 + 2}
print("resultArr中元素进行形变:\(resultArr)")
//对数组中的元素进行形变,每个元素的平方
let resultArr4 = x.map{fib in fib*fib}
print("resultArr4中元素进行形变:\(resultArr4)")
filter筛选
对于数组中的元素按照某种规则进行筛选
let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
//筛选数组中的元素为偶数的元素,返回一个新数组
//let result_arr = nums.filter{num in num % 2 == 0}
//或
let result_arr = nums.filter{$0 % 2 == 0}
print("result_arr:", result_arr) //[2, 4, 6, 8, 10]
zip函数
作用是将两个序列的元素,一一对应合并生成一个新序列。一般不会单独使用,而是会和其它的方法配合使用。
let a = [1, 2, 3, 4, 5]
let b = [ "a" , "b" , "c" , "d" ]
let c = zip(a, b). map { $0 }
print ("c:", c) //c: [(1, "a"), (2, "b"), (3, "c"), (4, "d")]
自定义实现类似功能,例如找出二维数组中相邻元素(相邻元素放入数组中)
swift中的extension与OC的category有点类似,但extension比起category更加强大和灵活,不仅仅可以同时扩展某种类型或结构体的方法,也可以protocol等结合使用
extension Array {
func split(where condition:(Element, Element) -> Bool) -> [[Element]] {
var result:[[Element]] = self.isEmpty ? [] :[[self[0]]]
for (previous, current) in zip(self, self.dropFirst()) {
if condition(previous, current) {
result.append([current])
} else {
result[result.endIndex-1].append(current)
}
}
return result
}
}
//调用
let arr = [1, 2, 2, 2, 3, 4, 4]
let parts = arr.split{$0 != $1}
print(parts) //[[1], [2, 2, 2], [3], [4, 4]]
reduce
一般用来对所有元素的操作,例如进行单独运算或者统一转换类型等
let fibs_arr = [0, 1, 1, 2, 3, 5]
var total = 0
for num in fibs_arr {
total = total + num
}
print("total:", total) //12
//或者
let sum = fibs_arr.reduce(0, +)
print("sum", sum) //12
//“象出两部分:一个初始值 (在这里是 ""),以及一个将中间值 (str) 与序列中的元素 (num) 进行合并的函数”
//“将一个整数列表转换为一个字符串,并且每个数字后面跟一个逗号和空格,那么可以这样:”
let arr_str = fibs_arr.reduce(""){str, num in str + "\(num),"}
print("arr_str:", arr_str)
for each和for in的区别
如果你想要对集合中的每个元素都调用一个函数的话,使用 forEach 会比较合适。但是在for each中的return 语句并不会终止循环,它做的仅仅是从闭包中返回,因此在 forEach 的实现中会开始下一个循环的迭代。
(1..<10).forEach { number in
print(number)
if number > 2 {return}//此时不会终止循环
}
//把子视图中所有视图都加到self.view上
var subArrs = [view1, view2]//仅仅测试
subArrs.forEach(self.view.addSubview(_:))
关于数组切片
“切片和它背后的数组是使用相同的索引来引用元素的。因此,切片索引不需要从零开始”,可以使用“startIndex 和 endIndex 属性做索引计算”
let slice = fibs_arr[1...]
print("slice:", slice) // [1, 1, 2, 3, 5]
print(type(of: slice)) // ArraySlice<Int>”