转换为当前语法时出错
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 }
去年,我做了一个关于如何创建相机应用程序的教程。今天我尝试 运行 它,但它需要转换为当前语法。在修复了大部分错误后,我现在只剩下一个我无法修复的错误。我对 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 }