如何检查Swift字典中的键并获取值:5种方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何检查Swift字典中是否存在键并获取值:面向新手和专家的完整指南

\n\n

处理字典是每位iOS开发者的日常。但当我们从简单的“存入值”过渡到“这个键到底存不存在?”时,麻烦就开始了。这个问题在Stack Overflow上获得了数千次浏览,这并非偶然:这个看似简单的任务隐藏着几个陷阱。

\n\n

在本文中,我们不仅会回答“如何判断Swift字典是否包含键并获取其任意值”这个问题,还会详细剖析5种不同的方法。您将了解哪种方法更快、哪种更安全,以及哪种只是优雅的代码,写起来和读起来都令人愉悦。

\n\n

快速入门:Swift中的Dictionary是什么?

\n\n

对于刚接触Swift的开发者:Dictionary 是一个键值对集合。键是唯一的,值可以重复。它看起来像这样:

\n\n
var userScores: [String: Int] = [\n    "Alice": 95,\n    "Bob": 87,\n    "Charlie": 92\n]
\n\n

现在想象一下:您想获取名为“David”的玩家的分数。但David不在字典中。如果直接写 userScores["David"],Swift不会崩溃,而是返回 nil。有趣的部分从这里开始。

\n\n

方法 #1:经典的if let —— 每个人都应该掌握的基础

\n\n

最简单且可读性最高的方法是使用可选绑定(optional binding)通过 if let。您可以同时检查键是否存在并获取值:

\n\n
let scores: [String: Int] = ["Alice": 95, "Bob": 87]\n\nif let aliceScore = scores["Alice"] {\n    print("Alice的分数:\\(aliceScore)")\n} else {\n    print("未找到该玩家")\n}
\n\n

优点:

\n
    \n
  • 代码可读性极高
  • \n
  • 安全处理可选值
  • \n
  • 无需调用额外方法
  • \n
\n\n

缺点:

\n
    \n
  • 如果只需要检查键是否存在而不获取值,则显得冗余
  • \n
\n\n

这种方法在90%的情况下是黄金标准。Apple官方文档也推荐使用它。

\n\n

方法 #2:Guard let —— 用于函数中的提前退出

\n\n

如果您在编写一个函数,其中键不存在是立即退出的原因,请使用 guard let。这能使代码扁平化,避免嵌套if语句造成的“死亡金字塔”:

\n\n
func printScore(for player: String, in scores: [String: Int]) {\n    guard let score = scores[player] else {\n        print("未找到玩家 \\(player)")\n        return\n    }\n    // 这里我们确信score存在\n    print("玩家 \\(player) 的分数:\\(score)")\n}\n\nprintScore(for: "Bob", in: ["Alice": 95, "Bob": 87]) // 玩家 Bob 的分数:87\nprintScore(for: "David", in: ["Alice": 95, "Bob": 87]) // 未找到玩家 David
\n\n

优点:

\n
    \n
  • 清晰地区分“错误路径”和“主要场景”
  • \n
  • 变量在guard语句后的整个作用域内可用
  • \n
\n\n

缺点:

\n
    \n
  • 如果只需要检查存在性而不退出函数,则不适用
  • \n
\n\n

方法 #3:通过contains(where:)检查 —— 当键可能很复杂时

\n\n

有时您不仅需要查找键,还需要根据某些条件检查它。例如,键是一个字符串,您正在寻找部分匹配。这时 contains(where:) 方法就派上用场了:

\n\n
let config: [String: Any] = [\n    "app_version": "2.1.0",\n    "build_number": 42,\n    "is_debug_mode": true\n]\n\n// 查找以 "app_" 开头的键\nlet hasAppKey = config.keys.contains { $0.hasPrefix("app_") }\nprint("存在 app_ 键:\\(hasAppKey)") // true\n\n// 根据第一个找到的键获取值\nif let appKey = confi                

博客

书籍推荐