使用 Swift 2 到 4 迁移进行异常处理



我正在将一些最初用 Swift2 编写的代码迁移到 Swift4。我已经完成了 Swift3 中间升级,并且在 Xcode9 中遇到了一些关于某些用户定义的枚举在其源文件之外使用的错误。

请考虑以下部分项目结构...

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

异常类型.swift

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

使用异常.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但不起作用。我有一种感觉,我可能错过了导入或其他东西。我不确定这是否重要,但是当我开始键入时,UseExceptions.swift文件中的XcodeAutocomplete确实可以识别MyError.

如上所示,在同级目录中的 swift 文件之间使用定义有什么特别之处吗?还是 Swift 4 处理异常处理的方式还有其他问题?

您缺少associatedValuecase 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是对的,这是旧式异常处理的问题。我从err1处理程序中删除了print("(e)")的实质性使用,编译器错误消失了。

我很好奇 Swift 2 中的异常处理功能是什么样的,它允许使用早期的语法和异常对象。

最新更新