Как безопасно развернуть значение словаря в Swift 4? - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь безопасно развернуть значение словаря, которое у меня есть внутри моей функции. Я нашел фрагмент из другого вопроса, который работал, но мне пришлось принудительно развернуть его, когда я печатал. Работал только тогда, когда было доступно определенное значение.

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»] является быстрой функцией 5. Может ли это быть проблемой?

Ответы [ 2 ]

2 голосов
/ 12 октября 2019

Ваша функция возвращает 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"
    }
}

- Использование Guard

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"]
}
2 голосов
/ 12 октября 2019

При использовании 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...