【发布时间】:2016-11-04 18:48:19
【问题描述】:
我正在尝试创建一个用于单击图片的自定义类。在其中,我想创建一个返回UIImage 的clickPicture 函数。但是,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
}
【问题讨论】:
-
旁注:请避免厄运的普拉米德。视频连接和 sampleBuffer 都可以用
guard let来检查,而不是if let -
@AMomchilov 有什么区别?我一般用
if let。 -
和这个问题基本一样:stackoverflow.com/questions/26569724/….
-
@penatheboss
guard为范围的其余部分绑定一个变量。例如,您可以将if sampleBuffer != nil { /* code */ } return nil替换为guard let sampleBuffer = sampleBuffer else { return nil } /* code */`/* code */ 部分不会嵌套在 if 块中 -
@penatheboss 这在您可能有(例如)10 个要检查的先决条件的情况下特别有用。与其将
if嵌套在if... 中 10 次,不如将 10 个连续的guards 放在一起。
标签: ios swift function return void