【问题标题】:Unexpectedly found nil while unwrapping an Optional value? Swift4在展开 Optional 值时意外发现 nil?斯威夫特4
【发布时间】:2018-08-10 07:37:45
【问题描述】:

我查看了Here 的解决方案,并尝试了几个,但没有一个有效。也许我遇到的这个问题可以帮助一些没有从我提供的链接中获得解决方案的人。

我正在尝试设置相机,但是,当我运行该应用程序时,我得到了以下信息。

在展开可选值时意外发现 nil

这发生在以下行:

        func setupInputOutput() {
//        if currentCamera != nil {
            do {
                let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!) //Here error happens
                captureSession.addInput(captureDeviceInput)
                photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
            } catch {
                print("error -- \(error)")
            }
//        }
    }

我声明 currentCamera 如下所示:

    var currentCamera: AVCaptureDevice?

【问题讨论】:

  • 您只是在声明“currentCamera”。您还应该初始化它。 currentCamera = AVCaptureDevice.default(for: AVMediaType.video)
  • 你还没有为 currentCamera 赋值,所以它的值为 nil,在评估它之前还要检查使用 if 条件的值。

标签: ios iphone swift camera avfoundation


【解决方案1】:

在初始化您的 AVCaptureDeviceInput 之前,获取默认的 AVCaptureDevice 并将其设置为您的 currentCamera 属性,如下所示

guard let device: AVCaptureDevice = AVCaptureDevice.default(.builtInWideAngleCamera,
    for: .video, position: .back) else {
    return
}
self.currentCamera = device

【讨论】:

    【解决方案2】:

    您正在崩溃,因为您使用 ! 强制展开 currentCamera当它可能为零时,此时,您的注释行您不确定它是否为零。

    首先,你应该确保你的 AVCaptureDevice 在到达这一点之前已经被初始化

    currentCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
    

    在 swift 中,通常你不应该使用 == nil 和 != nil。这正是 optionals 的目的所在,swift 有自己的处理方式。

        func setupInputOutput() {
            if let currentCamera = currentCamera {
                do {
                    let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!) //Here error happens
                    captureSession.addInput(captureDeviceInput)photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
                } catch {
                    print("error -- \(error)")
                }
            }
        }
    

    如果您不熟悉选项和展开,您应该查看有关它的 Apple 文档,可在此处找到:https://developer.apple.com/documentation/swift/optional

    【讨论】:

      【解决方案3】:
      var currentCamera: AVCaptureDevice?
      

      当你使用AVCaptureDevice? 时?表示它是一个可选的 var。 currentCamera 可以是AVCaptureDevice,也可以是nil

      3 种处理可选项的方法:

      // Using Guard
      guard let currentCam = currentCamera else {return}
      // do stuff using currentCam
      
      // Using if
      if let currentCam = currentCamera {
         // do stuff using currentCam
      }
      
      // Ugliest
      if currentCamera != nil {
         // do stuff using currentCam
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多