Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nil cannot be assigned to type AVCaptureDeviceInput

Tags:

swift

I've tried commenting out the line deviceInput = nil just for testing but got other errors. This code is present in other examples online so I'm not sure what's going on here.

private func captureSetup (position : AVCaptureDevicePosition) {
    var captureError : NSError?
    var captureDevice : AVCaptureDevice!

    for testedDevice in AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo){
        if (testedDevice.position == position) {
            captureDevice = testedDevice as! AVCaptureDevice
        }
    }

    if (captureDevice == nil) {
        captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    }

    var deviceInput : AVCaptureDeviceInput
    do {
        deviceInput = try AVCaptureDeviceInput(device: captureDevice)
    } catch let error as NSError {
        captureError = error
        deviceInput = nil  // Nil cannot be assigned to type AVCaptureDeviceInput
        if captureError != nil { // new if
            print("error: \(captureError?.localizedDescription)")
        }
    }
    captureSession.sessionPreset = AVCaptureSessionPresetHigh

    if (captureError == nil) {
        if (captureSession.canAddInput(deviceInput)) {
            captureSession.addInput(deviceInput)
        }

        self.videoDataOutput = AVCaptureVideoDataOutput()
        self.videoDataOutput!.videoSettings = [kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA)]
        self.videoDataOutput!.alwaysDiscardsLateVideoFrames = true
        self.videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL)
        self.videoDataOutput!.setSampleBufferDelegate(self, queue: self.videoDataOutputQueue!)

        if (captureSession.canAddOutput(self.videoDataOutput)) {
            captureSession.addOutput(self.videoDataOutput)
        }
    }

    visageCameraView.frame = UIScreen.mainScreen().bounds

    let previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) as AVCaptureVideoPreviewLayer // changed to let
    previewLayer.frame = UIScreen.mainScreen().bounds
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    visageCameraView.layer.addSublayer(previewLayer)
}
like image 968
TokyoToo Avatar asked Jun 13 '26 07:06

TokyoToo


1 Answers

It makes total sense to me. If you'd like to set it to nil. Use optionals. that way you can set it to nil. It's a good mechanism to avoid crashes and a ton of if statements for null checks. What I recommend (even for testing) is using optionals. This is how it would look like for you:

var deviceInput : AVCaptureDeviceInput?

Now deviceInput does NOT have to hold any valid value. so you could write the following (although it's default to nil)

deviceInput = nil

Now, say you want to use it elsewhere. You could use if let like this:

if let myNonNilValue = deviceInput {
    // myNonNilValue is for sure not nil
}
like image 185
Peyman Avatar answered Jun 15 '26 10:06

Peyman



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!