【问题标题】:How to safely unwrap a dictionary value in Swift 4?如何在 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” 这是没有意义的

标签: swift function dictionary


【解决方案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"]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多