Быстрое выражение из значения успеха результата возвращается к ошибке - PullRequest
2 голосов
/ 29 мая 2020

Как я могу получить значение, полученное из значения успеха Result в случае успеха или из значения ошибки в случае неудачи, без необходимости создавать временную переменную?

Вот рабочий, но подробный пример того, что я пытаюсь сделать:

let result = Result<Int, Error>.success(1)

let displayText: String
switch result {
case let .success(value): displayText = String(value)
case let .failure(error): displayText = "Result not available. \(error)"
}

updateDisplayText(displayText)

Я мог бы получить что-то близкое к тому, преобразовав результат в необязательное значение в желаемом формате, проверив его с помощью оператора try и используя nil -coalescing оператор для обеспечения отката.

updateDisplayText((try? result.map{ v in String(v) }.get()) ?? "Result not available.")

Однако этот подход не обращается к ошибке сбоя. Это тоже кажется слишком сложным. Есть ли подход, который работает с одним выражением, аналогично тому, что можно сделать с выражением соответствия F # ?

1 Ответ

1 голос
/ 29 мая 2020

В Swift нет «выражений соответствия». Насколько я знаю, если вы хотите сопоставить перечисления со связанными значениями, вы должны использовать какой-то оператор , будь то if case или switch или что-то еще.

Однако никто не может помешать вам поместить этот оператор в метод, который затем можно поместить в расширение!

extension Result {
    func mapBoth<T>(success: (Success) -> T, error: (Failure) -> T) -> T {
        switch self {
        case .success(let s):
            return success(s)
        case .failure(let e):
            return error(e)
        }
    }
}

updateDisplayText можно вызвать следующим образом:

updateDisplayText(result.mapBoth(
    success: { String($0) },
    failure: { "Result not available. \($0)" }
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...