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

unexpectedly found nil while unwrapping an optional value. avcapturedeviceinput

class ViewController: UIViewController {

    @IBOutlet weak var cameraView: UIView!

    var captureSession: AVCaptureSession?
    var videoPreviewLayer: AVCaptureVideoPreviewLayer?
    var frontCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for :.video, position: .front)
    var backCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)


    override func viewDidLoad() {
        super.viewDidLoad()

        if #available(iOS 10.2, *){

            let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
            do{
                let input = try AVCaptureDeviceInput(device: captureDevice!)
                captureSession = AVCaptureSession()
                captureSession?.addInput(input)
                videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
                videoPreviewLayer?.frame = view.layer.bounds
                cameraView.layer.addSublayer(videoPreviewLayer!)
                captureSession?.startRunning()
            }
            catch {
                print("error")
            }
        }
        // Do any additional setup after loading the view.
    }

    @IBAction func ImageCapture(_ sender: Any) {

    }

我正在使用 swift 代码编写一个简单的相机应用程序。我尝试了两种不同的方法,但两种方法都出现了相同的错误。

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value.

这里

let input = try AVCaptureDeviceInput(device: captureDevice!)

我该如何解决?

你运行在模拟器里吗?因为它不会工作。它将在真实设备中工作。还可以使用 if let 语句安全地打开 captureDevice。这不会使应用程序崩溃。

if #available(iOS 10.2, *){

    if let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) {
        do{
            let input = try AVCaptureDeviceInput(device: captureDevice)
            captureSession = AVCaptureSession()
            captureSession?.addInput(input)
            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
            videoPreviewLayer?.frame = view.layer.bounds
            cameraView.layer.addSublayer(videoPreviewLayer!)
            captureSession?.startRunning()
        }
        catch {
            print("error")
        }
    } else {
        print("camera not available")
    }
}

这里Optional Binding会帮助你,如果肯定不是nil,它会包装这个值,然后用确认的包装值继续程序流程。以下是 Optional Binding in Swift

的示例
if let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) {
    // do you desired code here, here captureDevice object has a confirmed value 
}else{
    // here captureDevice is nil, can assist the user accordingly
}