0

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

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

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 处理异常处理的方式还有其他问题吗?

4

2 回答 2

1

你错过了一个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)
}
于 2018-03-13T20:16:49.617 回答
-1

看起来@zombie 是对的,这是旧式异常处理的问题。print("\(e)")我从处理程序中删除了对的实质性使用,err1编译器错误消失了。

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

于 2018-03-13T20:14:29.527 回答