

Swift 4.0 中对 Dictionary 的改进 - SwiftCafe 享受代码的乐趣
source link: http://www.swiftcafe.io/post/swift4-dict
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Swift 4.0 中对 Dictionary 的改进
Swift 4.0 中对 Dictionary 的改进
swift 发布于 2020年12月18日
Swift 4 发布已经有一段时间了, 不知道大家有没有切换到 4.0 版本。 这次 4.0 更新给我最大的感受就是没有了前几次升级的跳跃式变化。 不用为了更新语言版本,完全推翻已有的项目,这也是 Swift 慢慢趋向于稳定的标志。
咱们这次说说 Swift 4.0 对 Dictionary 这个经常会用到的类的改进。
自动根据 key 分组Dictionary
新增了一个构造方法,可以将给定的一个数组,根据指定的条件进行分组。 来看一个例子:
var name: String
var gender: Gender
var age: Int
enum Gender {
case male
case female
}
}
这里有一个 Person
结构, 然后我们初始化一个数组:
let p2 = Person(name: "bb", gender: .male, age: 24)
let p3 = Person(name: "cc", gender: .male, age: 21)
let persons = [p1, p2, p3]
现在用新的 Dictionary
构造方法,可以立即将这组 Person 实例根据他们的 gender 属性进行分组:
return p.gender
}
这个构造方法,第一个参数 grouping
接收的是 persons 数组, 第二个参数是一个闭包,用于返回根据进行分组的依据,我们这里返回的是 p.gender
。结果一目了然:
.male: [
Person(name: "bb", gender: .male, age: 24),
Person(name: "cc", gender: .male, age: 21)
],
.female: [
Person(name: "aa", gender: .female, age: 22)
]
]
以往要实现这样的功能,就需要手动遍历整个数组,取出 key, 然后生成字典, 现在方便很多。
value 无缝转换另外一个比较有用的特性是,Dictionary
提供的 mapValues
方法。 还以我们刚才生成的 groupedDict
为例,可以进行这样的操作:
persons.count
}
先看一下输出,大家可能就猜到这个方法的用途是什么了:
[.male: 2,
.female: 1
]
上面的输出可以看到, mapValues
会遍历每一个 key 对应的 values, 然后传递给闭包进行自定义转换。 我们例子中的闭包返回的就是每个 key 对应的 Person 集合的数量,最生成了一个新的 Dictionary
,里面的 key 和之前一样,只是对应的值变成了我们闭包中自定义的了。
mapValues
方法同样是一个帮助我们解决繁杂操作的工具方法。
假如我们有这样一个数组:
let personsTuples = [("group 1", [p1, p2]), ("group 2", [p3])]然后可以调用 uniqueKeysWithValues
构造方法直接初始化字典:
personsTuples
数组中,每一个元素都是一个元组(Tuple), 这个构造方法把元组中的第一项当做 key, 第二项当做 value, 生成一个新的 Dictionary,如下所示:
"group 1": [
Person(name: "aa", gender: .female, age: 22),
Person(name: "bb", gender: .male, age: 24)
],
"group 2": [
Person(name: "cc", gender: .male, age: 21)
]
]
使用 uniqueKeysWithValues
构造方法时候需要注意,就是传入的数组中,不能有重复的 key, 否则会报运行时错误,比如这个数组就会报错:
上面数组中 group 2
出现了两次。 如果用它来初始化的话,就会出错。 所以 Swift 4.0 还提供了另外一个初始化方法, 对于上面这个数组,可以调用:
return new
}
第二个闭包参数,会在遇到重复的 key 时候调用。 它提供两个参数,一个是同样这个 key 的上一个值 old, 还有当前的值 new。 我们这里直接返回 new,意思就是 每次遇到重复的 key, 就用新的值代替老的值。 这样初始化后,生成的 Dictionary 结构如下:
["group 1": [
p1,
p2
],
"group 2": [
p4
]
]
group 2
中的值, 是第二次 key 所对应的 p4。
如果我们访问了一个字典中不存在的 key, 会返回 nil:
dict["group 3"]因为上面字典中,不存在 group 3
这个 key, 所以它返回了 nil。 Swift 4 中新增了指定默认值的能力:
这样调用,如果 group 3 这个 key 不存在的话, 就会返回我们指定的默认值空数组, 而不是 nil 了。 这个特性在我们处理 JSON 数据解析这类的问题上很实用。
过滤器过滤器对于集合类来说是比较常用的功能。 Swift 4 中对 Dictionary 类型也提供了过滤器的支持:
let filteredDict = dict.filter { key, val inreturn val.count >= 2
}
filter
方法接收一个闭包,它会遍历 Dictionary
中所有的元素,并且作为闭包的参数传入。 我们需要通过闭包的返回值确定这个元素是否被保留。 上面的例子中,比如我们 dict 中的元素是 :
"group 1": [
p1,
p2
],
"group 2": [
p4
]
]
调用 filter 后,我们只保留数量大于 2 的集合:
["group 1": [
p1,
p2
]
]总结
以上就是 Swift 4.0 对于 Dictionary
的主要改进。 这些新增的工具方法对于提高我们开发效率和代码质量都有帮助,希望这里的介绍对你有帮助。 关于 Dictionary
更完整的信息,大家还可以参考苹果官方的文档,还有 Swift Blog 中的介绍。
Dictionary
官方文档 https://developer.apple.com/documentation/swift/dictionary
Swift Blog: https://swift.org/blog/dictionary-and-set-improvements/
本站文章均为原创内容,如需转载请注明出处,谢谢。

发现更多精彩
swift-cafe
Recommend
-
11
SwiftCafe 享受代码的乐趣 桌面 Widget 设计规范swift 发布于 2020年12月16日 这次继续和大家探讨 Widget 相关话题。 苹果在大多数发布的技术组件, 都会给出一套建议的设计规范。 这次 iOS 14 发布的桌面 Wid...
-
17
iOS 14 制作自己的桌面 Widget iOS 14 制作自己的桌面 Widgetswift 发布于 2020年12月16日 在上一篇文章中, 我和大家介绍了 iOS 14 Widget 的基本内容, 了解了组成 Widget 的主要几个组件. 这篇文章开始, 我会...
-
9
iOS 14 Widget 上手体验 iOS 14 Widget 上手体验swift 发布于 2020年12月16日 今年的线上 WWDC 已经开始有一段时间了. 苹果在 iOS 14 中进行了一系列更新. 其中桌面 Widget 是最引人注意的一次革新. 在之前的...
-
43
SwiftCafe 享受代码的乐趣 SwiftUI 初体验swift 发布于 2020年12月18日 刚刚过去的 WWDC 2019 开场演讲,可以说是干货多多, 发布了很多有意思的东西。对我们公众号的用户群来说, 我最先想要分享的那肯定就是...
-
24
SwiftCafe 享受代码的乐趣 Swift 5 - 对 raw string 的支持swift 发布于 2020年12月18日 Swift 5 在今年年初正式发布了, 这个年轻的语言现在也变得越来越完善了, 最近打算和大家聊聊它最新的改变. 什么是...
-
8
如何用好 Android 包管理系统 如何用好 Android 包管理系统swift 发布于 2020年12月18日 这是第一次在这里和大家分享 Android 相关的内容, 其实我一直是 iOS 和 Android 都在做, 只是之前这里一...
-
10
SwiftCafe 享受代码的乐趣 多窗口命令行的玩法swift 发布于 2020年12月18日 我们平时在开发产品的时候都免不了要使用命令行. 比如安装 CocoaPods 组件, 或者操作 Git 版本库等等. 往往会用命令行同时操作几个...
-
5
Magnet: 推荐一款Mac上的好工具 Magnet: 推荐一款Mac上的好工具swift 发布于 2020年12月18日 作为一个应用开发者, 不知不觉也成了各大应用商店的常客, 经常会去看排行榜, 看看有没有好的应用值得研究入手.
-
7
了解 Xcode 项目文件 .xcodeproj 了解 Xcode 项目文件 .xcodeprojswift 发布于 2020年12月18日 作为一名开发者, 肯定对 Xcode 的项目文件 .xcodeproj 不陌生了. 我们用 Xcode 创建的任何一个项目...
-
10
伴随春天而来的 Swift 3.1 伴随春天而来的 Swift 3.1swift 发布于 2020年12月18日 Sequence 协议添加两个方法 protocol Sequence { // ... /// Returns a subsequence by skipping elements w...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK