Dictionary 字典中一个不太有用的特性

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

在 swift 中我们经常使用到字典(Dictionary),当用下标取值时,为了安全,取出的值是可选类型,比如:

javascript 复制代码
let user: [String: String] = ["name": "iOS 新知"]
print(user["name"])

这段代码打印 Optional("iOS 新知")。但有的时候往往可选值不是我们想要的,其实 swift 有提供一个方法来设置默认值。

取值时设置默认值

当我们查看 Dictionary 的声明部分,会看到这么一个方法:

less 复制代码
subscript(key: Key, default defaultValue: @autoclosure () -> Value) -> Value

这个下标方法支持用下标取值的同时设置一个默认值的,当所取的 key 不存在时,返回保底的 default 值,例如,当我取 "name" 时,如果 name 不存在,则默认输出 "iOS 新知",那么可以这么做:

vbnet 复制代码
let user: [String: String] = [:]
print(user["name", default: "iOS 新知"])

上边的代码打印 "iOS 新知",这个方法会自动把可选类型解包,返回的值不再是可选类型。

这个方法其实不太会用到,因为大多数情况我们会使用双问号 ?? 运算符来设置保底值:

javascript 复制代码
let user: [String: String] = [:]
print(user["name"] ?? "iOS 新知")

这段代码和使用 user["name", default: "iOS 新知"] 的效果是一样的。

可能有用的地方?

因为在字典中,下标方法不仅可以用作取值,也能用作设置值,因此我想到了一个可能的场景。

比如我的字典 ages 存储所有用户的年龄,key 为用户名,value 为年龄,有一个操作是让年龄 + 1,但这个字段有可能不存在,不存在时从 0 开始,那么正常的思路可能是这样的:

less 复制代码
var ages: [String: Int] = ["swift": 5]

// 先把值取出来,不存在默认为 0
let appleAge = ages["apple"] ?? 0
// 加一后再存起来
ages["apple"] = appleAge + 1

这个需求可以用 subscript(key: default:) 方法简化:

less 复制代码
var ages: [String: Int] = ["swift": 0]
ages["swift", default: 0] += 1

这种写法相对来说可读性更好,也更简单。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
iOS阿玮2 小时前
永远不要站在用户的对立面,挑战大众的公知。
uni-app·app·apple
法的空间5 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
2501_915918416 小时前
iOS 上架全流程指南 iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传 ipa 与审核实战经验分享
android·ios·小程序·uni-app·cocoa·iphone·webview
00后程序员张7 小时前
iOS App 混淆与加固对比 源码混淆与ipa文件混淆的区别、iOS代码保护与应用安全场景最佳实践
android·安全·ios·小程序·uni-app·iphone·webview
东坡肘子8 小时前
完成 Liquid Glass 的适配了吗?| 肘子的 Swift 周报 #0102
swiftui·swift·apple
Magnetic_h16 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
00后程序员张18 小时前
详细解析苹果iOS应用上架到App Store的完整步骤与指南
android·ios·小程序·https·uni-app·iphone·webview
前端小超超18 小时前
capacitor配置ios应用图标不同尺寸
ios·蓝桥杯·cocoa
2501_9151063219 小时前
Xcode 上传 ipa 全流程详解 App Store 上架流程、uni-app 生成 ipa 文件上传与审核指南
android·macos·ios·小程序·uni-app·iphone·xcode
kymjs张涛1 天前
零一开源|前沿技术周刊 #16
ios·apple·hacker news