返回函数内部无效

我正在尝试创build一个自定义类来点击图片。 在里面,我想创build一个返回一个UIImageclickPicture函数。 但是, captureStillImageAsynchronously是一个void 。 我怎样才能返回从我收到的图像? 谢谢。

 func clickPicture() -> UIImage? { if let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo) { videoConnection.videoOrientation = .portrait stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (sampleBuffer, error) -> Void in if sampleBuffer != nil { let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) let dataProvider = CGDataProvider(data: imageData!) let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) let image = UIImage(cgImage: cgImageRef!, scale: 1, orientation: .right) return image //Unexpected non-void return value in void function } return nil //Unexpected non-void return value in void }) } return nil } 

这是未经挑战的#2 Swift问题, 在解包可选的意外的零发现之后。

该方法很好地描述了什么是:

捕捉静止图像asynchronous

您不能从包含asynchronous任务的方法返回任何内容。
你需要一个完成块:

 func clickPicture(completion:(UIImage?) -> Void) { guard let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo) else { completion(nil) } videoConnection.videoOrientation = .portrait stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (sampleBuffer, error) -> Void in guard let buffer = sampleBuffer else { completion(nil) } let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) let dataProvider = CGDataProvider(data: imageData!) let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) let image = UIImage(cgImage: cgImageRef!, scale: 1, orientation: .right) completion(image) }) } 

并用这种方式来调用它:

 clickPicture { image in if unwrappedImage = image { // do something with unwrappedImage } }