先使用字典模拟一组数据,然后在下边对其进行操作。
enum Setting {
case text(String)
case ageNum(Int)
case bool(Bool)
}
let defaultSettings: [String:Setting] = [
"Airplane Mode":.bool(false),
"Name":.text("My iphone"),
"ageNum":.ageNum(10)
]
1.更改字典中的值。
方法一:通过key直接修改值的方式
/**
var userSettings = defaultSettings
作用是把不可变的 ”defaultSettings“ 复制一份并且命名为 ”userSettings“
*/
var userSettings = defaultSettings
userSettings["Name"] = .text("码农晨仔")
userSettings["Airplane Mode"] = .bool(true)
方法二:通过updateValue(_:forKey:)
方法进行更新。
let oldName = userSettings.updateValue(.text("小晨晨"), forKey: "name")
print(userSettings["Name"] ?? "")//输出 ”小晨晨“
let tempAge = userSettings.updateValue(.age(20), forKey: "ageNum")
print(userSettings["ageNum"] ?? 0)//输出 20“
2.两个字典进行合并可以使用方法merge(_:uniquingKeysWith:)
。
说明:该方法会把两个字典中相同的key上的值进行合并。
第一个参数:”需要进行合并的键值对“。
第二个参数:定义如何合并相同键的两个值的函数。
var setting = defaultSettings
let overriddenSettings:[String:Setting] = ["Name":.text("jiachenzailianxi")]
setting.merge(overriddenSettings, uniquingKeysWith: {$1})
print("setting==>\(setting)")
3.Dictionary(uniqueKeysWithValues:)
extension Sequence where Element:Hashable {
var frequencies:[Element:Int] {
let frequencyPairs = self.map{($0,1)}
print("frequencyPairs==>\(frequencyPairs)")
return Dictionary(frequencyPairs,uniquingKeysWith:+)
}
}
let frequencies = "hello".frequencies
print("frequencies + \(frequencies)")
print("==========")
frequencies.filter{$0.value > 1}
print("frequencies + \(frequencies.filter{$0.value > 1})")
4.mapValues
让结果继续保持字典的结构。
let settingAsStrings = settings.mapValues { setting -> String in
switch setting {
case .text(let text): return text
case .age(let number): return String(number)
case .bool(let value): return String(value)
}
}
print("settingsAsStrings ==> \(settingAsStrings)")
网友评论