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