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

时间:2015-10-27 18:07:14

标签: ios swift initialization try-catch swift2

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

  

"之前必须初始化类实例的所有存储属性   从初始化"

投掷

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

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
        }
      }
    }
  }
}

问题

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

1 个答案:

答案 0 :(得分:4)

  

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

是。您正在一个不可用的初始化程序中执行do...catch。这意味着在某些情况下仍可能无法正确进行初始化。你必须完成初始化才能抛出。例如,在您已经显示的代码中,如果您添加super.init()作为初始化程序的第一个行,那么一切都很好,因为您在投掷之前已完成初始化。

如果初始化失败,您可能会感觉更舒服,编写可用的初始值设定项(init?)。

编辑:请注意,在Swift 2.2中启动时,此要求将被解除:在完成初始化之前抛出是合法的。