Swift 2 中的函数错误处理

3
使用以下代码时出现了以下错误:
“无法将类型为'inout NSError?'(又名'inout Optional')的值转换为所期望的参数类型'()'”
这个错误出现在以下代码行上:
if device.lockForConfiguration(&error)

以下是剩余的代码:
func focusWithMode(focusMode:AVCaptureFocusMode, exposureMode:AVCaptureExposureMode, point:CGPoint, monitorSubjectAreaChange:Bool){

    dispatch_async(self.sessionQueue!, {
        var device: AVCaptureDevice! = self.videoDeviceInput!.device
        var error: NSError? = nil

        if device.lockForConfiguration(&error){
            if device.focusPointOfInterestSupported && device.isFocusModeSupported(focusMode){
                device.focusMode = focusMode
                device.focusPointOfInterest = point
            }
            if device.exposurePointOfInterestSupported && device.isExposureModeSupported(exposureMode){
                device.exposurePointOfInterest = point
                device.exposureMode = exposureMode
            }
            device.subjectAreaChangeMonitoringEnabled = monitorSubjectAreaChange
            device.unlockForConfiguration()
        }

    })

}

2
我猜想是关于 Swift 2 中的 try/catch 和 error,但问题提问者在玩弄我们。 - zaph
@jtbandes 这是错误:无法将类型为'inout NSError?'(又名'inout Optional<NSError>')的值转换为预期的参数类型'()'。 - wheelerscott
2
不要告诉我,而是告诉每个人。编辑你的问题并放入所需信息。请参见[ask]。 - jtbandes
1个回答

1
在Swift 2中,错误处理已从NSError的in-out参数转变为try/catch(而非异常)。
我认为这是从NSError到try/catch的正确转换:
func focusWithMode(focusMode:AVCaptureFocusMode, exposureMode:AVCaptureExposureMode, point:CGPoint, monitorSubjectAreaChange:Bool){
    dispatch_async(self.sessionQueue!, {
        var device: AVCaptureDevice! = self.videoDeviceInput!.device
        var error: NSError? = nil

        do {
           try device.lockForConfiguration()
            if device.focusPointOfInterestSupported && device.isFocusModeSupported(focusMode){
                device.focusMode = focusMode
                device.focusPointOfInterest = point
            }
            if device.exposurePointOfInterestSupported && device.isExposureModeSupported(exposureMode){
                device.exposurePointOfInterest = point
                device.exposureMode = exposureMode
            }
            device.subjectAreaChangeMonitoringEnabled = monitorSubjectAreaChange
            device.unlockForConfiguration()
        }
        catch {
            print("Locked error!")
        }
    })
}

这很棒,谢谢!唯一的问题是,它现在给我一个错误:“预期的模式”在第 let try locked = device.lockForConfiguration() 行。 - wheelerscott
好的,我已经弄清楚了,上面的答案非常接近。删除 let try locked = 并替换为 try。删除 if locked 及其相应的花括号。就这样! - wheelerscott
@Wheeler Preddy 更新了答案。 - zaph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接