Ich versuche, eine benutzerdefinierte Klasse zum Klicken auf Bilder zu erstellen. Innerhalb davon möchte ich eine clickPicture
Funktion erstellen, die eine UIImage
zurückgibt. Die captureStillImageAsynchronously
ist jedoch eine void
. Wie kann ich das von mir erhaltene Bild zurückgeben? Vielen Dank.Void innerhalb der Return-Funktion
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
}
Randbemerkung: Bitte vermeiden Sie die puramid des Schicksals. Videoverbindung und sampleBuffer können beide mit einem 'guard let' überprüft werden, anstatt mit einem' if let' – Alexander
@AMomchilov was ist der Unterschied? Ich benutze im Allgemeinen 'wenn lassen'. – penatheboss
Im Wesentlichen das gleiche Problem wie dieses: http://stackoverflow.com/questions/26569724/nsurlconnection-sendasynchronousrequest-cant-get-variable-out-of-closure. –