在 Swift 中,应用 map() 函数到字典的最简洁方法是什么?


在 Swift 中,我们可以使用 map() 方法应用于字典,从而对字典的值进行转换。此方法返回一个新创建的对象,该对象与原始字典具有相同的键,但值由映射函数转换。

示例 1:使用闭包转换值

在下面的示例中,我们使用 mapValues() 函数对字典中的每个值执行乘法运算。我们传递一个闭包,该闭包接受一个参数。在结果字典中,您可以看到每个值都已加倍。

import Foundation
let inputDictionary = [1: 2, 3: 4, 5: 6, 7: 8, 9: 10]
let modifiedDictionary = inputDictionary.mapValues { $0 * 2 }
print("Input Dictionary: \(inputDictionary)")
print("Modified Dictionary: \(modifiedDictionary)")

输出

Input Dictionary: [5: 6, 9: 10, 3: 4, 7: 8, 1: 2]
Modified Dictionary: [5: 12, 9: 20, 3: 8, 7: 16, 1: 4]

请注意,mapValues() 返回一个新的字典,因此原始字典不会被修改。如果您需要就地修改原始字典,则可以使用 for...in 循环遍历字典的键和值,并根据需要更新值。

示例 2:使用闭包转换键值对

以下是用 map() 函数对字符串字典进行转换以创建新的包含大写键值对数组的示例 -

在 Swift 中,您可以使用 map() 函数将字典转换为键值对数组,这些键值对已根据您提供的闭包进行转换。

import Foundation
let inputDictionary = ["apple": "red", "banana": "yellow", "orange": "orange"]
let transformedArray = inputDictionary.map { (key, value) in
   return (key.uppercased(), value.uppercased())
}
print("Input Dictionary: \(inputDictionary)")
print("Transformed Array: \(transformedArray)")

输出

Input Dictionary: ["apple": "red", "banana": "yellow", "orange": "orange"]
Transformed Array: [("APPLE", "RED"), ("BANANA", "YELLOW"), ("ORANGE", "ORANGE")]

在上面的示例中,我们将键值对转换为元组。每个元组都包含一个大写的键和值。我们使用 map() 函数访问键值对,并返回一个包含大写键值对的元组。

您应该注意,结果数组与原始字典不同。如果您想保持顺序,可以使用 sorted() 函数根据原始键对输出数组进行排序。

示例 3:使用闭包转换键

在此示例中,我们使用 map() 将字典键转换为大写。结果 transformedKeys 数组将包含转换后的键 ["ORANGE", "BANANA", "APPLE"]。

import Foundation
let inputDictionary = ["apple": "red", "banana": "yellow", "orange": "orange"]
let transformedKeys = inputDictionary.map { (key, value) in
   return key.uppercased()
}
print("Input Dictionary: \(inputDictionary)")
print("Transformed Keys: \(transformedKeys)")

输出

Input Dictionary: ["banana": "yellow", "orange": "orange", "apple": "red"]
Transformed Keys: ["BANANA", "ORANGE", "APPLE"]

示例 4:转换对象字典

在此示例中,我们有一个字典,其中值为自定义类 Person 的对象。我们使用 map() 将字典转换为字符串数组,其中每个字符串都包含人员的姓名和年龄。我们使用闭包的值参数访问每个 Person 对象的 name 和 age 属性。

import Foundation
class Person {
   var name: String
   var age: Int
    
   init(name: String, age: Int) {
      self.name = name
      self.age = age
   }
}
let peopleDict = ["Alice": Person(name: "Alice", age: 30),
                  "Bob": Person(name: "Bob", age: 25),
                  "Charlie": Person(name: "Charlie", age: 35)]
let namesAndAges = peopleDict.map { (key, value) in
   return "\(value.name) (\(value.age))"
}
print("namesAndAges: \(namesAndAges)")

输出

namesAndAges: ["Alice (30)", "Charlie (35)", "Bob (25)"]

示例 5:映射包含可选值的字典

在此示例中,我们有一个字典,其中值为可选整数。我们使用 compactMapValues() 方法删除值为空的任何键值对。这将返回一个仅包含非空值的新字典。

import Foundation
let inputDictionary: [String: Int?] = ["apple": 3, "banana": nil, "orange": 2, "pear": 4, "kiwi": nil]
let nonNilValues = inputDictionary.compactMapValues { $0 }
print("Input Dictionary: \(inputDictionary)")
print("nonNilValues: \(nonNilValues)")

输出

Input Dictionary: ["apple": Optional(3), "kiwi": nil, "banana": nil, "orange": Optional(2), "pear": Optional(4)]
nonNilValues: ["orange": 2, "apple": 3, "pear": 4]

结论

Swift 中一个强大的高阶函数 map() 使您能够根据提供的闭包更改一组组件。当涉及字典时,可以使用 map() 函数将字典的键、值或键值组合转换为新集合。

使用 map() 进行字典转换通常包括将字典的值更改为不同的类型,使用闭包更改字典的键或值,以及将字典转换为元组数组或具有相同或不同键和值的另一个字典。

更新于: 2023年5月4日

809 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告