这是一个有点令人困惑的问题,我希望有人可以说清楚。
我正在使用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
我在游乐场和模拟器上运行的代码中都看到了这种行为