Значение необязательного типа 'AVCaptureDevice?' должен быть развернут в значение типа 'AVCaptureDevice' - PullRequest
0 голосов
/ 10 ноября 2018

Я следовал учебному пособию о том, как захватить сканер штрих-кода с камеры ipad, и этот код был написан. Учебное пособие было написано в xcode 8, и я использую Xcode 10. Я получаю сообщение об ошибке,

"Значение необязательного типа 'AVCaptureDevice?' должен быть развернут в значение типа 'AVCaptureDevice' "

в операторе do try catch. Может кто-нибудь подсказать, пожалуйста, правильный способ борьбы с необязательным значением в этой ситуации? Когда я изменяю строку следующим образом: «let input = try AVCaptureDeviceInput (device: captureDevice!)» приложение вылетает.

import AVFoundation
import UIKit

class ScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
    var video = AVCaptureVideoPreviewLayer()    //contains what the camera is pointing at

    override func viewDidLoad() {
        super.viewDidLoad()

        //creates session
        let session = AVCaptureSession()

        //define capture device
        let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)

        do{
            let input = try AVCaptureDeviceInput(device: captureDevice)//Error occurs here
            session.addInput(input) //input coming from camera
        }
        catch{
            print("Error")
        }
        let output = AVCaptureMetadataOutput()
        session.addOutput(output)

        output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        output.metadataObjectTypes = [AVMetadataObject.ObjectType.code93, AVMetadataObject.ObjectType.code39]   //may need to change this based on barcode type
        video = AVCaptureVideoPreviewLayer(session: session)
        video.frame = view.layer.bounds
        view.layer.addSublayer(video)
        session.startRunning()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

1 Ответ

0 голосов
/ 12 июля 2019

Когда я искал ответ на этот вопрос, он сначала показывал только ваш вопрос. Затем я обратился за помощью к своему коллеге, и, наконец, он работал без ошибок. Попробуйте код ниже.

let captureDevice = AVCaptureDevice.default(for: .video)

do{
     let input = try AVCaptureDeviceInput(device: captureDevice!)
         if self.session.canAddInput(input) {
              self.captureSession.addInput(input)
         }
}
catch{
        print("Error")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...