Каков самый чистый способ в быстром бросить дополнительную ошибку? - PullRequest
0 голосов
/ 30 января 2019

Чтобы развернуть необязательное и передать его функции, которую я обычно использую:

var optionalInt: Int?

optionalInt.map { someFunctionThatTakes(aNonOptional: $0) }

Теперь у меня есть необязательная ошибка, которую я хотел бы выдать, если она не равна nil:

var optionalError: Error?

optionalError.map { throw $0 }

Это не сработает, потому что замыкание, переданное карте, не может сгенерировать.

Альтернативным решением было бы использование полного синтаксиса if let:

if let theError = optionalError { throw theError }

Но этоиспользует имя переменной theError дважды и более подвержено ошибкам, чем прекрасная реализация .map.

Кто-нибудь знает более чистый способ реализации этого?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

, если вы не используете try перед методом карты, это выдаст ошибку

Вызов может бросить, но не помечен как 'try'

Вместо этого используйте try, чтобы фактически выдать ошибку.

enum IntParsingError: Error {
    case overflow
    case invalidInput(String)
}

var optionalError: Error? = IntParsingError.overflow

   do {
    try optionalError.map { throw $0 }
   } catch {
     print(error)
   }

Вы также можете использовать flatMap, поскольку он оценивает закрытие необязательного экземпляра:not nil

optionalError.flatMap(throw $0)

Но все же, если let будет лучшим способом обработки дополнительной ошибки вместо map и flatMap.

0 голосов
/ 30 января 2019

Это не сработает, потому что закрытие, переданное карте, не может сгенерировать.

Это не так.Закрытие, переданное

func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?

, может вызвать ошибку.Но это заставляет map() называть себя (пере) бросающим выражением, поэтому оно должно вызываться с try:

var optionalError: Error?
// ...
try optionalError.map { throw $0 }

Я бы, вероятно, все еще использовал бы

if let theError = optionalError { throw theError }

что очень ясно, и не использует Optional.map для его побочных эффектов (отбрасывая возвращаемое значение типа Void?).

...