Search code examples
ios11swift4ios-cameraxcode9.1

Conditional cast from '[AVCaptureDevice]' to '[AVCaptureDevice]' always succeeds. Yellow warning


I have this bit of code and it's throwing a yellow warning. I can't work out how to code it so the yellow warning goes away. Trying to clean up my code after converting from Swift-2 -> 3 -> 4.

   override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        //On iPad Mini this returns 760 x 1024 = correct
        //On the iPhone SE, this returns 320x568 = correct
        print("Width: \(screenWidth)")
        print("Height: \(screenHeight)")

        //=======================

        captureSession.sessionPreset = AVCaptureSession.Preset.high

        if #available(iOS 10.0, *) {
            if let devices = AVCaptureDevice.default(AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: AVMediaType.video, position: .back) {

                print("Device name: \(devices.localizedName)")

            }
        } else {

         }

 if let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] {
        // Loop through all the capture devices on this phone
        for device in devices {

            print("Device name: \(device.localizedName)")

            // Make sure this particular device supports video
            if (device.hasMediaType(AVMediaType.video)) {
                // Finally check the position and confirm the back camera
                if(device.position == AVCaptureDevice.Position.back) {
                    captureDevice = device
                    if captureDevice != nil {
                        print("Capture device found")
                        beginSession()


                }
            }
        }
    }
   }

}

Solution

  • The error message says that you conditionally cast a non-optional type to an optional type which is redundant.

    ⌥-click on devices to check its declaration

    class func devices() -> [AVCaptureDevice]

    So it's simply

    let devices = AVCaptureDevice.devices()
    // Loop through all the capture devices on this phone
    for device in devices { ...