Обработка исключений с помощью 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, который позволял использовать более ранний синтаксис и объект исключения.