Swift 3照片捕捉

我正在使用这段代码:

func capturePhoto(blockCompletion: @escaping blockCompletionCapturePhoto) { guard let connectionVideo = self.stillCameraOutput.connection(withMediaType: AVMediaTypeVideo) else { blockCompletion(nil, nil) return } connectionVideo.videoOrientation = AVCaptureVideoOrientation.orientationFromUIDeviceOrientation(orientation: UIDevice.current.orientation) self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { (sampleBuffer: CMSampleBuffer!, err: NSError!) -> Void in if let err = err { blockCompletion(image: nil, error: err) } else { if let sampleBuffer = sampleBuffer, let dataImage = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) { let image = UIImage(data: dataImage) blockCompletion(image: image, error: nil) } else { blockCompletion(image: nil, error: nil) } } } } 

它在Swift 2.0中运行良好,但转换后它不再起作用了。 这一行:

 self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { (sampleBuffer: CMSampleBuffer!, err: NSError!) -> Void in 

给我以下错误:

无法将类型’(CMSampleBuffer!,NSError!) – > Void’的值转换为预期的参数类型’((CMSampleBuffer?,错误?) – > Void)!’

我已经尝试了一些东西,但无法解决它。 希望有人可以帮助我。

什么错误

无法将类型’(CMSampleBuffer!,NSError!) – > Void’的值转换为预期的参数类型’((CMSampleBuffer?,错误?) – > Void)!’

基本上说是你的参数是错误的类型( (CMSampleBuffer!, NSError!) -> Void )虽然它应该是类型((CMSampleBuffer?, Error?) -> Void)!

要实现这一点,请尝试使用此代码,它应该自动使您的块符合正确的类型:

 self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { sampleBuffer, error in //do stuff with your sample buffer, don't forget to handle errors } 

它看起来像一个奇怪的类型,但我认为这是一个小错误Apple在将此代码从ObjC迁移到Swift 1到Swift 2到Swift 3时的某个地方。
我没有测试过这段代码,但我认为它应该可行,让我知道它是否确实如此!

在swift 3中,命令改变了!

从:

 captureStillImageAsynchronouslyFromConnection 

至:

 captureStillImageAsynchronously 

所以试试这段代码:

 self.stillCameraOutput?.captureStillImageAsynchronously(from: connectionVideo, completionHandler: { (sampleBuffer, error) in // do your stuff here }