我已经寻找了Here的解决方案,并尝试了几个,没有一个有效。也许这个问题可以帮助一些没有从我提供的链接中得到解决方案的人。
我试图设置一个相机,然而,我得到了以下当我运行的应用程序。
意外地在展开可选值时发现为零。
这发生在下面所示的行中:
func setupInputOutput() {
// if currentCamera != nil {
do {
let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!) //Here error happens
captureSession.addInput(captureDeviceInput)
photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
} catch {
print("error -- \(error)")
}
// }
}我声明currentCamera如下所示:
var currentCamera: AVCaptureDevice?发布于 2018-08-10 07:45:24
在初始化AVCaptureDeviceInput之前,获取默认AVCaptureDevice并将其设置为currentCamera属性,如下所示
guard let device: AVCaptureDevice = AVCaptureDevice.default(.builtInWideAngleCamera,
for: .video, position: .back) else {
return
}
self.currentCamera = device发布于 2018-08-10 07:52:07
您正在遭受崩溃,因为您是强制展开currentCamera!当它可能是零,此时,您的评论行,您不确定它是否为零。
首先,您应该确保在到达此点之前已经初始化了您的AVCaptureDevice,方法是
currentCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)一般来说,您不应该使用== 0和!= nil。这正是选拔赛的初衷,斯威夫特也有自己的应对方式。
func setupInputOutput() {
if let currentCamera = currentCamera {
do {
let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!) //Here error happens
captureSession.addInput(captureDeviceInput)photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
} catch {
print("error -- \(error)")
}
}
}如果您不熟悉选项和展开,应该查看有关它的苹果文档,如下所示:https://developer.apple.com/documentation/swift/optional
发布于 2018-08-10 08:06:11
var currentCamera: AVCaptureDevice?当你使用AVCaptureDevice??意味着它是一个可选的变量。currentCamera可以是AVCaptureDevice,也可以是nil
处理选拔赛的3种方法:
// Using Guard
guard let currentCam = currentCamera else {return}
// do stuff using currentCam
// Using if
if let currentCam = currentCamera {
// do stuff using currentCam
}
// Ugliest
if currentCamera != nil {
// do stuff using currentCam
}https://stackoverflow.com/questions/51781396
复制相似问题