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

时间:2018-03-13 19:33:22

标签: swift enums associated-value

我将最初用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

时,来自UseExceptions.swift文件的Xcode中的MyError.会识别

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

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:-1)

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

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