转换为当前语法时出错

Error when converting to current syntax

去年,我做了一个关于如何创建相机应用程序的教程。今天我尝试 运行 它,但它需要转换为当前语法。在修复了大部分错误后,我现在只剩下一个我无法修复的错误。我对 AVFoundation 或 Swift 4 不太熟悉,所以我希望我能得到一些帮助。我得到的错误在第 61/62 行:

Initializer for conditional binding must have optional type, not [AVCaptureDevice]

相关代码如下:

//capture devices
func configureCaptureDevices() throws {
    let session = AVCaptureDevice.DiscoverySession(deviceTypes: [], mediaType: <#T##AVMediaType?#>, position: <#T##AVCaptureDevice.Position#>)
    guard let cameras = (session.devices.flatMap { [=10=] }), !cameras.isEmpty else { throw CameraControllerError.noCamerasAvailable}

    for camera in cameras {
        if camera.position == .front {
            self.frontCamera = camera
        }

        if camera.position == .back {
            self.rearCamera = camera

            try camera.lockForConfiguration()
            camera.focusMode = .continuousAutoFocus
            camera.unlockForConfiguration()
        }

    }
}

最后,link 我正在关注的教程:https://www.appcoda.com/avfoundation-swift-guide/

问题是您使用的 guard let 语法仅用于绑定可选值。你已经正确地推断出 session 不再是可选的(这就是你删除 ? 的原因)。所以从 guard 语句中提取 cameras 的赋值:

let session = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .unspecified)
let cameras = session.devices.flatMap { [=10=] }
guard !cameras.isEmpty else { throw CameraControllerError.noCamerasAvailable }

就个人而言,既然我们不再进行任何可选绑定,我会用更直观的 if 语句替换 guard 语句。我也不相信 flatMap 是必需的(你在处理数组数组或可选数组时使用它,这两者都不适用于此处):

let cameras = session.devices
if cameras.isEmpty { throw CameraControllerError.noCamerasAvailable }