ios - Xcode 7 beta 3 的 Swift 2 中的 try/catch 行为不正确?

标签 ios xcode swift

我在使用 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/

相关文章:

ios - 如何在 iOS SDK 中包含第 3 方 SDK

ios - 从存储在 Core Data 中的 NSData 播放视频

swift - Swift 中的底部类型

ios - Swift 5 CAKeyframeAnimation - 应用程序移至后台后恢复图层动画

ios - 注释是否会从可执行的 Objective-C 中删除

ios - 如何让导航栏显示在 AVCapture session 中

iphone - Objective-C 命名约定——澄清

swift - 如何在没有 View Controller 作为所有者的情况下将 Nib 实例化为 View ?

ios - 一对多关系的 NSBatchUpdateRequest

ios - 如何在iOS中使特定部分功能等待