数组常用方法
// 创建数组 var numbers = [1, 2, 3, 4, 5] var emptyArray: [Int] = [] var initializedArray = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0] // 基本操作 numbers.append(6) // 添加元素:[1, 2, 3, 4, 5, 6] numbers.insert(0, at: 0) // 插入元素:[0, 1, 2, 3, 4, 5, 6] let removed = numbers.remove(at: 0) // 删除并返回:[1, 2, 3, 4, 5, 6], removed = 0 let last = numbers.removeLast() // 删除最后一个:[1, 2, 3, 4, 5], last = 6 // 查询 let count = numbers.count // 元素个数:5 let isEmpty = numbers.isEmpty // 是否为空:false let first = numbers.first // 第一个元素:Optional(1) let lastElement = numbers.last // 最后一个:Optional(5) let contains = numbers.contains(3) // 是否包含:true let index = numbers.firstIndex(of: 3) // 元素索引:Optional(2) // 遍历 for number in numbers { print(number) // 1, 2, 3, 4, 5 } for (index, number) in numbers.enumerated() { print("\(index): \(number)") // 0: 1, 1: 2, 2: 3... } // 高阶函数(非常常用!) let doubled = numbers.map { $0 * 2 } // [2, 4, 6, 8, 10] let filtered = numbers.filter { $0 > 2 } // [3, 4, 5] let sum = numbers.reduce(0) { $0 + $1 } // 15 let hasEven = numbers.contains { $0 % 2 == 0 } // true // 排序 let sorted = numbers.sorted() // 升序 let sortedDesc = numbers.sorted(by: >) // 降序 numbers.sort() // 原地排序 numbers.sort(by: >) // 原地降序排序 // 切片 let slice = numbers[1...3] // [2, 3, 4] (ArraySlice类型) let prefix = numbers.prefix(3) // 前3个:[1, 2, 3] let suffix = numbers.suffix(2) // 后2个:[4, 5] // 其他实用方法 numbers.shuffle() // 随机打乱 let shuffled = numbers.shuffled() // 返回打乱的新数组 numbers.reverse() // 原地反转 let reversed = numbers.reversed() // 返回反转的序列 numbers.removeAll() // 清空数组 numbers.removeAll(where: { $0 > 3 }) // 删除所有大于3的元素
字典常用方法
// 创建字典 var scores = ["Alice": 95, "Bob": 80, "Charlie": 90] var emptyDict: [String: Int] = [:] var initializedDict = Dictionary(uniqueKeysWithValues: [("a", 1), ("b", 2)]) // 基本操作 scores["David"] = 85 // 添加或更新 let score = scores["Alice"] // 获取值:Optional(95) scores["Alice"] = nil // 删除键值对 let removedValue = scores.removeValue(forKey: "Bob") // 删除并返回值 // 查询 let count = scores.count // 键值对数量 let isEmpty = scores.isEmpty // 是否为空 let keys = scores.keys // 所有键 let values = scores.values // 所有值 let contains = scores.keys.contains("Alice") // 是否包含键 // 遍历 for (name, score) in scores { print("\(name): \(score)") } for name in scores.keys { print(name) } for score in scores.values { print(score) } // 转换 let names = Array(scores.keys) // 键数组 let allScores = Array(scores.values) // 值数组 // 更新值 scores.updateValue(100, forKey: "Alice") // 更新,返回旧值 scores["Bob", default: 0] += 10 // 安全地增加值 // 合并字典 let newScores = ["Eve": 88, "Frank": 92] scores.merge(newScores) { current, new in new } // 合并,冲突时用新的 let merged = scores.merging(newScores) { $1 } // 返回新字典 // 分组 let students = ["Alice", "Bob", "Charlie", "David"] let grouped = Dictionary(grouping: students) { $0.first! } // 按首字母分组 // 过滤 let highScores = scores.filter { $0.value > 85 } // 筛选高分
集合常用方法
// 创建集合 var fruits: Set = ["apple", "banana", "orange"] var numbers: Set<Int> = [1, 2, 3, 4, 5] var emptySet: Set<String> = [] // 基本操作 fruits.insert("grape") // 添加元素 let removed = fruits.remove("apple") // 删除元素,返回删除的值 fruits.removeFirst() // 删除第一个元素 fruits.removeAll() // 清空集合 // 查询 let count = fruits.count // 元素个数 let isEmpty = fruits.isEmpty // 是否为空 let contains = fruits.contains("banana") // 是否包含 // 集合操作 let setA: Set = [1, 2, 3, 4] let setB: Set = [3, 4, 5, 6] let union = setA.union(setB) // 并集:[1, 2, 3, 4, 5, 6] let intersection = setA.intersection(setB)// 交集:[3, 4] let subtracting = setA.subtracting(setB) // 差集:[1, 2] let symmetricDiff = setA.symmetricDifference(setB) // 对称差:[1, 2, 5, 6] // 集合关系 let isSubset = setA.isSubset(of: setB) // 是否是子集:false let isSuperset = setA.isSuperset(of: setB)// 是否是超集:false let isDisjoint = setA.isDisjoint(with: setB) // 是否没有交集:false let isStrictSubset = setA.isStrictSubset(of: setB) // 真子集 let isStrictSuperset = setA.isStrictSuperset(of: setB) // 真超集 // 遍历 for fruit in fruits { print(fruit) } for fruit in fruits.sorted() { // 排序遍历 print(fruit) } // 高阶函数 let uppercased = fruits.map { $0.uppercased() } // 映射 let longFruits = fruits.filter { $0.count > 5 } // 过滤 let totalLength = fruits.reduce(0) { $0 + $1.count } // 归约 // 转换 let arrayFromSet = Array(fruits) // 转为数组 let setFromArray = Set([1, 2, 2, 3, 3]) // 转为集合:[1, 2, 3](去重)
元组常用方法
// 创建元组 let person = (name: "Alice", age: 30, isStudent: false) // 命名元组 let coordinates = (40.7128, -74.0060) // 未命名元组 var mutableTuple = ("John", 25) // 可变元组 // 访问元素 let name = person.name // 通过名称访问:"Alice" let age = person.1 // 通过索引访问:30 let (x, y) = coordinates // 解构赋值 let (firstName, _, _) = person // 部分解构 // 修改元组(必须是 var) mutableTuple.0 = "Mike" // 通过索引修改 // person.name = "Bob" // ❌ 错误,let 常量不可改 // 类型别名 typealias Point = (x: Double, y: Double) let origin: Point = (0, 0) // 作为函数返回值 func getMinMax(numbers: [Int]) -> (min: Int, max: Int)? { guard let min = numbers.min(), let max = numbers.max() else { return nil } return (min, max) } if let bounds = getMinMax(numbers: [5, 3, 8, 1]) { print("Min: \(bounds.min), Max: \(bounds.max)") // Min: 1, Max: 8 } // 比较(只能比较最多6个元素的元组) let tuple1 = (1, "apple") let tuple2 = (2, "banana") let tuple3 = (1, "apple") tuple1 == tuple3 // true tuple1 < tuple2 // true(按顺序比较元素) // 遍历(需要转为数组或使用反射) let values = Mirror(reflecting: person).children for (label, value) in values { print("\(label ?? ""): \(value)") } // 实用技巧:交换值 var a = 5, b = 10 (a, b) = (b, a) // 交换:a=10, b=5 // 多个返回值 func calculateStatistics(scores: [Int]) -> (sum: Int, avg: Double, count: Int) { let sum = scores.reduce(0, +) let avg = Double(sum) / Double(scores.count) return (sum, avg, scores.count) } let stats = calculateStatistics(scores: [85, 90, 78, 92]) print("Sum: \(stats.sum), Average: \(stats.avg), Count: \(stats.count)")
常用模式总结
1.安全的集合操作
// 安全地获取和修改 if let score = scores["Alice"] { // 处理分数 } // 使用 default 值 let score = scores["Bob", default: 0] // 安全的数组访问 if numbers.indices.contains(10) { let value = numbers[10] } // 使用 first 和 last(返回可选值) if let first = numbers.first { // 处理第一个元素 }
2.链式调用
// 数组链式操作 let result = numbers .filter { $0 > 3 } .map { $0 * 2 } .sorted() .reduce(0, +) // 字典链式操作 let topScorers = scores .filter { $0.value > 90 } .map { $0.key } .sorted()
3.性能考虑
// 使用 lazy 延迟计算(大数据集时) let bigResult = numbers.lazy .filter { $0 > 1000 } .map { $0 * 2 } // 使用 Set 快速查找 let largeSet = Set(largeArray) // O(1) 查找,但占用更多内存
Swift 5.7+ 新特性
// if-let 简写 if let scores["Alice"] { // 直接使用 } // 多行集合字面量 let matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
![]()