如何在 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 中使用嵌套字典发送 POST 请求

如何在 Swift 2.0 中正确解开这些 CLPlacemarks?

如何在 Swift 的绑定中解开可选值?

Swift 4 如何在文档目录中写入/读取字典?

我们如何在 swift 2.3 中将值附加到包含 3 个元素的字典中?

如何使用swift获取字典中的索引值