ios - 类实例的所有存储属性必须在从初始化器抛出之前初始化

标签 ios swift initialization try-catch swift2

我有一个类来处理 AVFoundation 的电影录制。如果设置的任何部分失败,初始化程序将抛出错误。失败错误:

"All stored properties of a class instance must be initialized before throwing from an initialize"

当尝试从初始化器创建变量时会发生这种情况,如果初始化失败也会抛出错误。

let captureInputDevice = try AVCaptureDeviceInput(device: device)

代码:

enum MovieRecorderError : ErrorType {
  case CouldNotInitializeCamera
}

class MovieRecorder: NSObject {

  init(previewLayer: UIView) throws {  
    // Scan through all available AV capture inputs
    for device in AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as! [AVCaptureDevice] {
      if device.position == .Back {
        do {
          let captureInputDevice = try AVCaptureDeviceInput(device: device)
        } catch {
          throw MovieRecorderError.CouldNotInitializeCamera
        }
      }
    }
  }
}

问题

这个问题是在一个抛出错误的函数中实例化一个抛出错误的变量引起的吗?

最佳答案

Is this problem caused by instantiating a variable that throws an error, inside a function that throws an error?

是的。您正在一个不可失败的初始化程序中执行 do...catch。这意味着在某些情况下可能无法正确进行初始化。必须先完成初始化才能抛出。例如,在您显示的代码中,如果您将 super.init() 添加为初始化程序的 first 行,则一切正常,因为您已完成初始化 throw 前。

如果初始化可能会失败,您可能会更舒服,编写一个可失败的初始化程序 (init?)。

编辑:请注意,从 Swift 2.2 开始,此要求将被取消:完成初始化之前抛出是合法的。

关于ios - 类实例的所有存储属性必须在从初始化器抛出之前初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33375431/

相关文章:

ios - Xamarin iOS 本地通知不起作用

c++ - 返回值初始化

swift - 通过初始化器注入(inject)依赖项(使用 Storyboard)? [ swift ]

Git 工作流程/部署

ios - iOS 中多部分表单数据请求的库

objective-c - 选择 RowAtIndexPath : animated: scrollPosition: - Row is "selected"

iphone - 多个 UILabel 实例

json - 在 swift 中创建 json 对象 : Consecutive statements on a line must be separated by ';'

swift - 仅当系统唤醒时触发计时器 (macOS)

iOS - 阴影在 UILabel 上传播