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)
}
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
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With