本文章内容基于Swift5。
一、Array
初始化
// []
let intEmptyArray = [Int]()
// [1.0, 1.0, 1.0]
let doubleArray = Array(repeating: 1.0, count: 3)
print(doubleArray)
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let intArray = Array(0 ... 10)
print(intArray)
添加
var numbers = [1, 2, 3]
var addNumbers = [4, 5, 6]
// [1, 2, 3, 11]
numbers.append(11)
print(numbers)
// [1, 2, 3, 11, 4, 5, 6]
numbers.append(contentsOf: addNumbers)
print(numbers)
// [1, 2, 3, 11, 4, 5, 6, 7, 8]
numbers += [7, 8]
print(numbers)
// [99, 1, 2, 3, 11, 4, 5, 6, 7, 8]
numbers.insert(99, at: 0)
print(numbers)
替换
// [99, 10, 2, 3, 11, 4, 5, 6, 7, 8]
numbers[1] = 10
print(numbers)
查找
print("有6吗? 结果:\(numbers.contains(6))") // 有6吗? 结果:true
// 获取指定范围内元素
let number6 = [1, 22, 31, 10, 4]
print(number6.prefix(upTo: 2)) // 前2个元素 [1, 22]
print(number6.suffix(from: 1)) // from到结尾 [22, 31, 10, 4]
删除
// 删除最后一位
// [99, 10, 2, 3, 11, 4, 5, 6, 7]
numbers.removeLast()
print(numbers)
// 删除指定位置
// [99, 2, 3, 11, 4, 5, 6, 7]
numbers.remove(at: 1)
print(numbers)
// 全部删除
numbers.removeAll()
迭代
for i in 0 ..< 10 {
// 0到9
}
for i in 0 ... 10 {
// 0到10
}
for i in (0 ..< 10).reversed() {
// 反向遍历
}
for num in numbers {
// 迭代数组
print(num)
}
var dropNumbers = [1, 2, 3, 4, 5]
for num in dropNumbers.dropFirst() {
// 除了第一个元素外的数组其余部分
print("dropFirst \(num)")
// dropFirst 2
// dropFirst 3
// dropFirst 4
// dropFirst 5
}
print(dropNumbers.dropFirst(3)) // [4, 5]
print(dropNumbers.dropLast(3)) // [1, 2]
let number2 = ["a", "b", "c", "d", "e", "f"]
// 列举 元素 和 下标
for (index, element) in zip(number2.indices, number2) {
print("index: \(index), element:\(element)")
}
// index: 0, element:a
// index: 1, element:b
// index: 2, element:c
// index: 3, element:d
// index: 4, element:e
// index: 5, element:f
// 同时遍历索引和元素
let number2 = ["a", "b", "c", "d", "e", "f"]
for (index, num) in number2.enumerated() {
print("\(index): \(num)")
// 0: a
// 1: b
// 2: c
// 3: d
// 4: e
// 5: f
}
// 倒序循环 10~5
for num in stride(from: 10, to: 5, by: -1) {
print(num)
// 10
// 9
// 8
// 7
// 6
}
// 数组的索引:["a", "b", "c", "d", "e", "f"]
print("数组的索引:\(number2[number2.startIndex ..< number2.endIndex])")
高阶函数
Filter
firstIndex(where predicate: (Element) throws -> Bool) rethrows -> Int?
// 查找某一元素的位置
if let idx = number2.firstIndex(where: { $0 == "d" }) {
// 找到了: 3
print("找到了: \(idx)")
}
filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]
let number3 = [2, 4, 6, 8, 10]
let filter = number3.filter { $0 > 5 }
print(filter) // [6, 8, 10]
let number4 = ["Aa1", "Bak", "66Z2", "Po2"]
let array = number4.filter { str -> Bool in
str.contains("2")
}
// ["66Z2", "Po2"]
print(array)
Map
map(_ transform: (Element) throws -> T) rethrows -> [T]
map 将于拿来数组元素映射到新数组中:映射数组,转换元素
let number5 = ["a", "b", "c"]
let mapArray1 = number5.map { num -> String in
"\(num)A"
}
// "aA", "bA", "cA"]
print(mapArray1)
let mapArray2 = (1 ... 3).map { $0 * 3 }
// [3, 6, 9]
print(mapArray2)
CompactMap
compactMap 去掉数组中的nil元素
let mapArray3 = [1, 2, 3, nil].compactMap { $0 }
// [1, 2, 3]
print(mapArray3)
compactMap 强制解包
let mapArray4: [String?] = ["1", "2", "3"]
print("map: \(mapArray4.map { $0 })")
// map: [Optional("1"), Optional("2"), Optional("3")]
print("compactMap: \(mapArray4.compactMap { $0 })")
// compactMap: ["1", "2", "3"]
Reduce
reduce 把数组变成一个元素
let reduceArray = (1 ... 5).reduce(0, +)
print(reduceArray) // 15
let numbers = [1, 2, 3, 4]
let reduceArray = numbers.reduce("sss") { a1, a2 -> String in
"\(a1)" + "\(a2)"
}
print(reduceArray) // sss1234
二、Tuple
元组的使用
var boy = ("Nick", 20, 180.5)
print("Tuple, boy: \(boy)")
// 打印:Tuple, boy: ("Nick", 20, 180.5)
print("Name: \(boy.0), age: \(boy.1), height: \(boy.2)cm")
// 打印:Name: Nick, age: 20, height: 180.5cm
// 修改
boy.1 = 21
print("Modify, age: \(boy.1)")
// 打印:Modify, age: 21
let teacher = (name: "LiLei", city: "Beijing", tel: "13211228888")
print("Teacher name: \(teacher.name), city: \(teacher.city), tel: \(teacher.tel)")
// 打印:Teacher name: LiLei, city: Beijing, tel: 13211228888
三、Set
集合的使用
// 求 一个集合求另一个集合的补集 setA-setB
let setA: Set = ["Aa", "Bb", "Cc", "Dd"]
let setB: Set = ["Gg", "Vv", "Aa", "Cc", "Ll", "Dd"]
let setC = setA.subtracting(setB)
print(setC) // ["Bb"]
// 求 两个集合的交集
let setA1: Set = ["Aa", "Bb", "Cc", "Dd"]
let setB1: Set = ["Gg", "Vv", "Aa", "Cc", "Ll", "Dd"]
let setC1 = setA1.intersection(setB1)
print(setC1) // ["Aa", "Dd", "Cc"]
// 不包含公共的 两个集合的所有元素
let setA2: Set = ["Aa", "Bb", "Cc", "Dd"]
let setB2: Set = ["Gg", "Vv", "Aa", "Cc", "Ll", "Dd"]
let setC2 = setA2.symmetricDifference(setB2)
print(setC2) // ["Ll", "Vv", "Bb", "Gg"]
// 检查是否是子集
let setA3: Set = ["Aa", "Bb", "Cc", "Dd"]
let setB3: Set = ["Aa", "Bb", "Cc", "Dd", "Ll", "Dd"]
print(setA3.isSubset(of: setB3))
四、总结
在Swift中,数组(Array)和元组(Tuple)都是用来存储一组值的集合,但它们在使用上有明显区别;
数组:适合存储一组同类型的可变数据。
元组:适合临时存储一组不同类型的固定数据,尤其在函数中用于返回多个值。
集合:适合存储一组唯一的无序数据,适合需要快速查找和集合操作的场景。