【问题标题】:Void Inside of Return function返回函数的内部无效
【发布时间】:2016-11-04 18:48:19
【问题描述】:

我正在尝试创建一个用于单击图片的自定义类。在其中,我想创建一个返回UIImageclickPicture 函数。但是,captureStillImageAsynchronouslyvoid。我怎样才能返回我收到的图像?谢谢。

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


【解决方案1】:

这是 在解开可选项时发现意外的 nil 之后无可争议的 #2 Swift 问题。

该方法很好地描述了它的作用:

异步捕获静止图像。

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

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
   } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2013-05-23
    • 2020-09-25
    • 2013-09-14
    • 2023-02-23
    • 2017-12-29
    相关资源
    最近更新 更多