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

带有关联值的Swift error enum在switch语句中返回错误的enum文字,swift,enums,Swift,Enums,这是一个有点令人困惑的问题,我希望有人能够解释一下 我使用Result样式的枚举来捕获异步调用的成功或失败 我正在使用另一个枚举将多个错误组合在一起,其中一些错误具有关联的值 我有一个回调,看起来像Result->Void 我使用它将错误传递回调用代码 好的,到目前为止一切都很简单。然而,我看到的问题是,当我有一个带有关联值的错误枚举时,有时错误会在调用站点打印出来 我将尝试通过一点代码来说明我的意思: enum Result<T, E: ErrorType> { case

这是一个有点令人困惑的问题,我希望有人能够解释一下

我使用
Result
样式的枚举来捕获异步调用的成功或失败

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

我有一个回调,看起来像
Result->Void
我使用它将错误传递回调用代码

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

我将尝试通过一点代码来说明我的意思:

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

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

我无法用Xcode 7.2重现您的结果。所有测试都打印A、B、C、D(加上一些相关值)。非常感谢您为我检查。我真的很感激。不幸的是,我们的构建服务器还不是最新的7.2版本,所以我现在只能使用这个早期版本。我将浏览一下更改注释,看看是否能找到任何东西来解释我在这个堆栈溢出帖子中看到的任何其他灵魂的不同之处,我已经能够在XCode 7.1(swift 2.1)中尝试了没有看到这个问题,所以它看起来像是与XCode 7.0.1附带的特定swift版本隔离的。我无法用XCode 7.2复制您的结果。所有测试都打印A、B、C、D(加上一些相关值)。非常感谢您为我检查。我真的很感激。不幸的是,我们的构建服务器还不是最新的7.2版本,所以我现在只能使用这个早期版本。我将浏览一下更改注释,看看是否能找到任何东西来解释我在这个堆栈溢出帖子中看到的任何其他灵魂的不同之处,我已经能够在XCode 7.1(swift 2.1)中尝试了没有看到这个问题,所以看起来它与XCode 7.0.1附带的特定swift版本是隔离的。
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))
}
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))
}
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))
}
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")))
}
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")
xcrun swift -version
Apple Swift version 2.0 (swiftlang-700.0.59 clang-700.0.72)
Target: x86_64-apple-darwin15.0.0