带有关联值的Swift错误枚举在switch语句中返回错误的枚举文字

时间:2016-01-29 17:41:08

标签: swift enums

这是一个有点令人困惑的问题,我希望有人可以说清楚。

我正在使用Result<T, E: ErrorType>样式枚举来捕获异步调用的成功或失败。

我正在使用另一个枚举将多个错误组合在一起,其中一些错误具有关联值

我的回调看起来像Result<Void, MyError> -> Void 我用来将错误传回给调用代码。

好的,到目前为止一切都很简单。但是,我看到的问题是,当我有一个带有关联值的错误枚举时,有时会在调用站点打印出错误的错误。

我将通过一些代码尝试展示我的意思:

enum Result<T, E: ErrorType> {
    case Success(T)
    case Failure(E)
}

测试1

typealias MyCallback1 = Result<Void, MyError1> -> Void

enum MyError1: ErrorType {
    case A, B, C, D
}

func test1() {
    execute1() { result in
        switch (result) {
        case .Success(_):
            break
        case let .Failure(error):
            print(error)
            break
        }
    }
}

func execute1(callback: MyCallback1) {
    callback(.Failure(.A))
    callback(.Failure(.B))
    callback(.Failure(.C))
    callback(.Failure(.D))
}

测试2

typealias MyCallback2 = Result<Void, MyError2> -> Void

enum MyError2: ErrorType {
    case A(String), B, C, D
}

func test2() {
    execute2() { result in
        switch (result) {
        case .Success(_):
            break
        case let .Failure(error):
            print(error)
            break
        }
    }
}

func execute2(callback: MyCallback2) {
    callback(.Failure(.A("a")))
    callback(.Failure(.B))
    callback(.Failure(.C))
    callback(.Failure(.D))
}

测试3

typealias MyCallback3 = Result<Void, MyError3> -> Void

enum MyError3: ErrorType {
    case A(String), B, C(String), D
}

func test3() {
    execute3() { result in
        switch (result) {
        case .Success(_):
            break
        case let .Failure(error):
            print(error)
            break
        }
    }
}

func execute3(callback: MyCallback3) {
    callback(.Failure(.A("a")))
    callback(.Failure(.B))
    callback(.Failure(.C("c")))
    callback(.Failure(.D))
}

测试4

typealias MyCallback4 = Result<Void, MyError4> -> Void

enum MyError4: ErrorType {
    case A(String), B, C, D(String)
}

func test4() {
    execute4() { result in
        switch (result) {
        case .Success(_):
            break
        case let .Failure(error):
            print(error)
            break
        }
    }
}

func execute4(callback: MyCallback4) {
    callback(.Failure(.A("a")))
    callback(.Failure(.B))
    callback(.Failure(.C))
    callback(.Failure(.D("d")))
}

测试5

typealias MyCallback5 = Result<Void, MyError5> -> Void

enum MyError5: ErrorType {
    case A, B, C, D(String)
}

func test5() {
    execute5() { result in
        switch (result) {
        case .Success(_):
            break
        case let .Failure(error):
            print(error)
            break
        }
    }
}

func execute5(callback: MyCallback5) {
    callback(.Failure(.A))
    callback(.Failure(.B))
    callback(.Failure(.C))
    callback(.Failure(.D("d")))
}

运行测试的结果如下:

Test1
A
B
C
D

Test2
A("a")
B
C
D

Test3
A("a")
B
C("c")
B <---- Hmmm?

Test4
A("a")
B
B <---- Hmmm?
D("d")

Test5
A
B
C
D("d")

我有点不知道为什么测试3和4会打印出他们所做的结果。任何善良的人都可以赐教。

亲切的问候

编辑:一些其他信息。 我正在使用XCode版本7.0.1(7A1001)。

xcrun swift -version
Apple Swift version 2.0 (swiftlang-700.0.59 clang-700.0.72)
Target: x86_64-apple-darwin15.0.0

我在游乐场和模拟器上运行的代码中都看到了这种行为

0 个答案:

没有答案