我在使用 Xcode 7 beta 3 编译的一些 Swift 2 代码时遇到问题。
我有一个类(见下文),它有一个初始化器,它接受一个函数 f,它可以抛出异常。如果 f 不抛出异常,则应将成员变量 (self.result) 设置为封装 f 返回值的枚举实例。如果 f 确实抛出异常,则 self.result 应设置为指示该值不存在的枚举实例。在初始化程序结束时,self.result 不应为 nil。我检查了 f 不抛出的情况,并且行为是正确的。然而,在 f 确实抛出的情况下, self.result 在初始化器末尾为 nil (断言被触发)。如果我在调试器中单步执行,我会看到 self.result 似乎立即被设置,然后闪回到 nil。
(注意:您可能建议我将不存在结果表示为 nil,而不是包装在枚举中。但是,我需要对 f 的结果尚未计算、已成功计算的场景进行建模,或者已尝试计算结果但失败。因此是枚举。)
我是否误解了 Swift 2 错误处理的工作原理?或者,编译器/调试器等行为是否不正确?
提前致谢。
internal enum Result<T> {
case Value(T)
case None
}
public final class MyClass<T> {
internal var result: Result<T>? = nil
private init(f: () throws -> T) {
let queueName = “some.string”
let queue = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT)
dispatch_async(queue) {
do {
let value = try f()
self.result = .Value(value)
}
catch {
self.result = .None
}
assert(self.result != nil, "Result must have value before block returns.")
}
}
}
最佳答案
在
self.result = .None
左侧是一个可选 Result
,因此.None
右侧被推断为 Optional.None
,并且该语句
相当于
self.result = nil
你的意思可能是
self.result = Result.None
然后断言就不会再失败了。或者,
使用不同的枚举值,例如您的自定义中的 case NoValue
类型。
关于ios - Xcode 7 beta 3 的 Swift 2 中的 try/catch 行为不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677024/