MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Swift数组与字典操作技巧

2022-12-187.0k 阅读

一、Swift 数组操作技巧

(一)数组的创建与初始化

  1. 基本创建方式 在 Swift 中,创建数组非常简单。我们可以使用以下语法创建一个空数组:
var emptyArray: [Int] = []
// 或者使用更简洁的方式
var anotherEmptyArray = [Int]()

这里,我们创建了一个 Int 类型的空数组。如果我们想要创建一个带有初始值的数组,可以这样做:

var numbers = [1, 2, 3, 4, 5]
var fruits = ["apple", "banana", "cherry"]
  1. 特定数量与初始值的数组 有时候,我们需要创建一个具有特定数量且每个元素都有相同初始值的数组。可以使用 init(repeating:count:) 方法:
var filledArray = Array(repeating: 0, count: 10)
// 这里创建了一个包含10个0的Int数组
  1. 类型推断与显式类型声明 Swift 强大的类型推断机制使得在很多情况下我们不需要显式声明数组的类型。例如:
var inferredArray = [1, 2, 3]
// Swift 会推断inferredArray为[Int]类型

但是,在某些复杂场景或者需要明确类型时,显式声明类型会让代码更加清晰:

var explicitArray: [Double] = [1.5, 2.5, 3.5]

(二)数组元素的访问与修改

  1. 通过索引访问元素 数组中的元素可以通过索引来访问。索引从 0 开始,例如:
var numbers = [1, 2, 3, 4, 5]
let firstNumber = numbers[0]
let thirdNumber = numbers[2]

需要注意的是,如果访问的索引超出数组的范围,会导致运行时错误。为了避免这种情况,可以在访问前检查索引是否有效:

if numbers.indices.contains(5) {
    let nonExistentNumber = numbers[5]
} else {
    print("Index out of range")
}
  1. 修改数组元素 可以通过索引直接修改数组中的元素:
var numbers = [1, 2, 3, 4, 5]
numbers[2] = 10
// 现在数组变为[1, 2, 10, 4, 5]
  1. 使用 subscript 进行范围访问 我们可以使用 subscript 来访问数组的一个范围的元素。例如,获取数组的前三个元素:
var numbers = [1, 2, 3, 4, 5]
let subArray = numbers[0..<3]
// subArray 为 [1, 2, 3]

这个范围访问返回的是一个新的数组,对原数组没有影响。如果想要修改原数组的一个范围的元素,可以这样做:

var numbers = [1, 2, 3, 4, 5]
numbers[0..<3] = [10, 20, 30]
// 现在数组变为[10, 20, 30, 4, 5]

(三)数组的添加与删除操作

  1. 添加元素
    • append(_:) 方法:用于在数组末尾添加一个元素。
var numbers = [1, 2, 3]
numbers.append(4)
// 数组变为[1, 2, 3, 4]
- **`+` 运算符**:可以用于将两个数组合并成一个新数组。
var array1 = [1, 2, 3]
var array2 = [4, 5, 6]
var combinedArray = array1 + array2
// combinedArray 为 [1, 2, 3, 4, 5, 6]
- **`insert(_:at:)` 方法**:用于在指定索引位置插入一个元素。
var numbers = [1, 2, 3]
numbers.insert(10, at: 1)
// 数组变为[1, 10, 2, 3]
  1. 删除元素
    • remove(at:) 方法:删除指定索引位置的元素,并返回被删除的元素。
var numbers = [1, 2, 3]
let removedNumber = numbers.remove(at: 1)
// 数组变为[1, 3],removedNumber 为 2
- **`removeLast()` 方法**:删除并返回数组的最后一个元素。
var numbers = [1, 2, 3]
let lastNumber = numbers.removeLast()
// 数组变为[1, 2],lastNumber 为 3
- **`removeAll()` 方法**:删除数组中的所有元素,使数组变为空数组。
var numbers = [1, 2, 3]
numbers.removeAll()
// 数组变为 []

(四)数组的遍历

  1. for - in 循环遍历 这是最常见的遍历数组的方式:
var numbers = [1, 2, 3, 4, 5]
for number in numbers {
    print(number)
}
  1. 带索引的遍历 有时候我们不仅需要数组元素,还需要元素的索引。可以使用 enumerated() 方法:
var numbers = [1, 2, 3, 4, 5]
for (index, number) in numbers.enumerated() {
    print("Index \(index): \(number)")
}
  1. 反向遍历 如果需要反向遍历数组,可以使用 reversed() 方法:
var numbers = [1, 2, 3, 4, 5]
for number in numbers.reversed() {
    print(number)
}

(五)数组的筛选与映射

  1. 筛选数组(filter(_:) 方法) filter(_:) 方法用于根据给定的条件筛选数组中的元素,返回一个新的数组,包含满足条件的元素。例如,筛选出数组中的偶数:
var numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
// evenNumbers 为 [2, 4]
  1. 映射数组(map(_:) 方法) map(_:) 方法用于对数组中的每个元素应用一个变换,返回一个新的数组,包含变换后的元素。例如,将数组中的每个元素乘以 2:
var numbers = [1, 2, 3, 4, 5]
let doubledNumbers = numbers.map { $0 * 2 }
// doubledNumbers 为 [2, 4, 6, 8, 10]

(六)数组的排序

  1. sorted() 方法 sorted() 方法返回一个新的已排好序的数组,原数组不变。例如,对一个整数数组进行升序排序:
var numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
let sortedNumbers = numbers.sorted()
// sortedNumbers 为 [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

如果需要降序排序,可以提供一个自定义的比较闭包:

let descendingSortedNumbers = numbers.sorted { $0 > $1 }
// descendingSortedNumbers 为 [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
  1. sort() 方法 sort() 方法会直接对原数组进行排序,不返回新数组。例如:
var numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
numbers.sort()
// numbers 现在为 [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

二、Swift 字典操作技巧

(一)字典的创建与初始化

  1. 基本创建方式 在 Swift 中,字典是一种无序的键值对集合。我们可以使用以下语法创建一个空字典:
var emptyDictionary: [String: Int] = [:]
// 或者使用更简洁的方式
var anotherEmptyDictionary = [String: Int]()

这里,我们创建了一个键为 String 类型,值为 Int 类型的空字典。如果我们想要创建一个带有初始值的字典,可以这样做:

var ages = ["John": 30, "Jane": 25, "Bob": 35]
  1. 使用 init(_:) 方法 我们还可以通过传递一个包含键值对的数组来初始化字典:
let keyValuePairs = [("one", 1), ("two", 2), ("three", 3)]
var numbersDictionary = [String: Int](keyValuePairs)

(二)字典元素的访问与修改

  1. 通过键访问值 字典中的值可以通过键来访问。例如:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
let johnsAge = ages["John"]

需要注意的是,通过键访问值可能返回 nil,因为键可能不存在于字典中。为了安全地访问值,可以使用可选绑定:

if let bobsAge = ages["Bob"] {
    print("Bob's age is \(bobsAge)")
} else {
    print("Bob's age not found")
}
  1. 修改字典元素 可以通过键直接修改字典中的值:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
ages["John"] = 31
// 现在字典中John的年龄变为31
  1. 添加新的键值对 如果字典中不存在某个键,通过给该键赋值就可以添加一个新的键值对:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
ages["Alice"] = 28
// 现在字典变为["John": 30, "Jane": 25, "Bob": 35, "Alice": 28]

(三)字典的删除操作

  1. removeValue(forKey:) 方法 removeValue(forKey:) 方法用于删除指定键对应的键值对,并返回被删除的值(如果存在)。例如:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
let removedAge = ages.removeValue(forKey: "Jane")
// 现在字典变为["John": 30, "Bob": 35],removedAge 为 25
  1. removeAll() 方法 removeAll() 方法用于删除字典中的所有键值对,使字典变为空字典。例如:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
ages.removeAll()
// 现在字典变为 [:]

(四)字典的遍历

  1. 遍历键值对 可以使用 for - in 循环遍历字典的键值对:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
for (name, age) in ages {
    print("\(name) is \(age) years old")
}
  1. 遍历键或值 如果只需要遍历字典的键或值,可以分别使用 keysvalues 属性:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
for name in ages.keys {
    print(name)
}
for age in ages.values {
    print(age)
}

(五)字典的合并与更新

  1. 字典的合并 在 Swift 中,没有直接合并两个字典的运算符。但是我们可以通过扩展来实现字典的合并。例如:
extension Dictionary {
    mutating func merge(_ other: [Key: Value]) {
        for (key, value) in other {
            self[key] = value
        }
    }
}
var dict1 = ["a": 1, "b": 2]
var dict2 = ["b": 3, "c": 4]
dict1.merge(dict2)
// dict1 现在变为 ["a": 1, "b": 3, "c": 4]
  1. 字典的更新 updateValue(_:forKey:) 方法用于更新字典中指定键的值,如果键不存在,则添加新的键值对。例如:
var ages = ["John": 30, "Jane": 25]
let oldAge = ages.updateValue(31, forKey: "John")
// oldAge 为 30,现在字典中John的年龄变为31
let newAge = ages.updateValue(26, forKey: "Alice")
// newAge 为 nil,现在字典变为["John": 31, "Jane": 25, "Alice": 26]

(六)字典的筛选与映射

  1. 筛选字典 类似于数组的筛选,我们可以根据一定条件筛选字典中的键值对。例如,筛选出年龄大于 30 的人:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
let filteredAges = ages.filter { $0.value > 30 }
// filteredAges 为 ["Bob": 35]
  1. 映射字典 映射字典可以对字典中的每个值应用一个变换,返回一个新的字典。例如,将每个人的年龄加 1:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
let newAges = ages.mapValues { $0 + 1 }
// newAges 为 ["John": 31, "Jane": 26, "Bob": 36]

(七)字典的排序

  1. 根据键排序 要根据字典的键对字典进行排序,可以先将字典的键值对转换为数组,然后对数组进行排序。例如:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
let sortedByKey = ages.sorted { $0.key < $1.key }
for (name, age) in sortedByKey {
    print("\(name): \(age)")
}
  1. 根据值排序 同样,根据值排序也需要先转换为数组,然后使用自定义的比较闭包。例如,根据年龄从小到大排序:
var ages = ["John": 30, "Jane": 25, "Bob": 35]
let sortedByValue = ages.sorted { $0.value < $1.value }
for (name, age) in sortedByValue {
    print("\(name): \(age)")
}

通过掌握以上 Swift 数组与字典的操作技巧,开发者可以更加高效地处理数据集合,编写出更加健壮和灵活的 Swift 代码。无论是在小型应用程序还是大型项目中,这些技巧都能帮助我们更好地管理和操作数据。