swift中 列表、字典、集合、元祖 常用的方法

数组常用方法

Swift 复制代码
// 创建数组
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的元素

字典常用方法

Swift 复制代码
// 创建字典
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 } // 筛选高分

集合常用方法

Swift 复制代码
// 创建集合
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](去重)

元组常用方法

Swift 复制代码
// 创建元组
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. 安全的集合操作

Swift 复制代码
// 安全地获取和修改
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. 链式调用

Swift 复制代码
// 数组链式操作
let result = numbers
    .filter { $0 > 3 }
    .map { $0 * 2 }
    .sorted()
    .reduce(0, +)

// 字典链式操作
let topScorers = scores
    .filter { $0.value > 90 }
    .map { $0.key }
    .sorted()

3. 性能考虑

Swift 复制代码
// 使用 lazy 延迟计算(大数据集时)
let bigResult = numbers.lazy
    .filter { $0 > 1000 }
    .map { $0 * 2 }

// 使用 Set 快速查找
let largeSet = Set(largeArray)  // O(1) 查找,但占用更多内存

Swift 5.7+ 新特性

Swift 复制代码
// if-let 简写
if let scores["Alice"] {
    // 直接使用
}

// 多行集合字面量
let matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
相关推荐
ULTRA??4 小时前
Informed RRT*实现椭圆启发式采样
c++·算法
Swizard4 小时前
告别样本不平衡噩梦:Focal Loss 让你的模型学会“划重点”
算法·ai·训练
Java水解4 小时前
基于Rust实现爬取 GitHub Trending 热门仓库
数据结构·后端
亭台4 小时前
【Matlab笔记_23】MATLAB的工具包m_map的m_image和m_pcolor区别
笔记·算法·matlab
李玮豪Jimmy4 小时前
Day39:动态规划part12(115.不同的子序列、583.两个字符串的删除操作、72.编辑距离)
算法·动态规划
Luna-player5 小时前
在前端中list.map的用法
前端·数据结构·list
历程里程碑5 小时前
C++ 10 模板进阶:参数特化与分离编译解析
c语言·开发语言·数据结构·c++·算法
星辞树5 小时前
从 In-context Learning 到 RLHF:大语言模型的范式跃迁
算法
再__努力1点6 小时前
【68】颜色直方图详解与Python实现
开发语言·图像处理·人工智能·python·算法·计算机视觉