如何在 Swift 4 中安全地解开字典值?
Posted
技术标签:
【中文标题】如何在 Swift 4 中安全地解开字典值?【英文标题】:How to safely unwrap a dictionary value in Swift 4? 【发布时间】:2019-10-11 23:10:59 【问题描述】:我正在尝试安全地解开函数中的字典值。我从另一个有效的问题中找到了一个 sn-p,但我在打印时不得不强制打开它。只有在有确定的价值可用时才有效。
func emailAddress(for name: String) -> String?
let emails = ["daniel":"danielsenga@yahoo.com","Kevin":"Kevin@gmail.com"]
let email = emails[name ?? "none"]
return email
print(emailAddress(for: "daniel" )!)
这段代码在工作时会打开和关闭。我更喜欢使用 if-let 安全地解包它,但是当我输入此代码来解包时。
func emailAddress(for name: String) -> String?
let emails = ["daniel":"danielsenga@yahoo.com","Kevin":"Kevin@gmail.com"]
if let email = emails[name]
print(email)
else
print("There is no email address")
return email
Swift 给了我各种各样的错误,我不确定问题出在哪里。可选项已经令人困惑,现在对于仅作为可选项的字典来说,打开包装对我来说是一场噩梦。当我使用在线示例时,它们可以工作,但我自己的实现是一场灾难。
我还看到 电子邮件[姓名 ?? "none"] 是一个 swift 5 的功能。这会是个问题吗?
【问题讨论】:
??
被称为 nil 合并运算符。它仅用于在您的对象是可选的情况下指定默认值
您需要在打印后返回电子邮件,并在您的方法结束时返回 nil 而不是电子邮件。不要忘记删除?? “none”
这是没有意义的
【参考方案1】:
当使用if let
时,email
仅在块内可见,您需要
func emailAddress(for name: String) -> String
let emails = ["daniel":"danielsenga@yahoo.com","Kevin":"Kevin@gmail.com"]
return emails[name] ?? "none"
对于你的代码,它就像
func emailAddress(for name: String) -> String?
let emails = ["daniel":"danielsenga@yahoo.com","Kevin":"Kevin@gmail.com"]
if let email = emails[name]
print(email)
return email
print("There is no email address")
return nil
【讨论】:
【参考方案2】:您的函数返回String?
。原始字典也返回String?
。所以根本没有必要(安全/不安全地)解开值!
您应该做的第一件事是更改函数String
的返回类型(不是可选的)。
那么你有一些方法可以让它安全:
- 可选绑定
func emailAddress(for name: String) -> String
let emails = ["daniel":"danielsenga@yahoo.com","Kevin":"Kevin@gmail.com"]
if let email = emails[name]
return email
else
return "none"
- 使用守卫
func emailAddress(for name: String) -> String
let emails = ["daniel":"danielsenga@yahoo.com","Kevin":"Kevin@gmail.com"]
guard let email = emails[name] else return "none"
return email
- 使用 nil 合并
func emailAddress(for name: String) -> String
let emails = ["daniel":"danielsenga@yahoo.com","Kevin":"Kevin@gmail.com"]
return emails[name] ?? "none"
- 字典默认
func emailAddress(for name: String) -> String
let emails = ["daniel":"danielsenga@yahoo.com","Kevin":"Kevin@gmail.com"]
return emails[name, default: "none"]
【讨论】:
或return emails[name, default: "none"]
以上是关于如何在 Swift 4 中安全地解开字典值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 2.0 中正确解开这些 CLPlacemarks?