Обработка исключений с помощью Swift 2 to 4 Migration

Я перевожу код, изначально написанный на Swift2, на Swift4. Я завершил промежуточное обновление Swift3 и обнаружил некоторые ошибки в Xcode9, касающиеся некоторых определенных пользователем перечислений enum вне их исходного файла.

Рассмотрим следующую частичную структуру проекта...

Project
  --EnumDefs
  ----ExceptionTypes.swift
  --UI
  ----UseExceptions.swift

ExceptionTypes.swift

enum MyError : Error {
    case err1
    case err2
}
...

UseExceptions.swift

...
    do {
        ...
    }  catch MyError.err1(let e) {
        print("\(e)")
    }  catch let e {
        print("\(e)")
    } 

...

Я также попробовал вариант синтаксиса, который я видел онлайн

catch let e as MyError.err1 {

все равно не повезло, я вижу ошибку компилятора:

Enum element 'err1' is not a member type of 'MyError'

Я пытался сделать область видимости MyError, которая будет определена public который не работал. Я чувствую, что я могу пропустить импорт или что-то. Я не уверен, имеет ли это значение, но Autocomplete в Xcode из файла UseExceptions.swift распознает, когда я начинаю печатать MyError.

Есть ли что-то особенное в использовании определений между файлами swift в одном каталоге, как показано выше? Или здесь что-то не так с тем, как Swift 4 работает с обработкой исключений?

2 ответа

Вам не хватает associatedValue, case err1(String)

func test() throws {
    throw MyError.err1("error")
}

enum MyError : Error {
    case err1(String)
    case err2
}

do {
    try test()
} catch MyError.err1(let e) {
    print(e)
}

Похоже, @zombie был прав, это был вопрос обработки исключений старого стиля. Я удалил основное использование print("\(e)") от err1 обработчик и ошибка компилятора исчезли.

Мне любопытно, на что были похожи возможности обработки исключений в Swift 2, который позволял использовать более ранний синтаксис и объект исключения.

Другие вопросы по тегам