我正在开发一个可以检测视频输入中矩形的相机应用程序,无论如何我找到了一个示例项目。但有一件事我仍然无法理解那里发生的事情。
以下是代码
class CameraViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate
{
var applyFilter: ((CIImage) -> CIImage?)?;
override func viewDidLoad() {
super.viewDidLoad();
applyFilter = {
image in
return self.performRectangleDetection(image);
}
}
func performRectangleDetection(image: CIImage) -> CIImage? {
//code returns CIImage
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
let opaqueBuffer = Unmanaged<CVImageBuffer>.passUnretained(imageBuffer!).toOpaque();
let pixelBuffer = Unmanaged<CVPixelBuffer>.fromOpaque(opaqueBuffer).takeUnretainedValue();
let sourceImage = CIImage(CVPixelBuffer: pixelBuffer, options: nil);
let detectionResult = applyFilter?(sourceImage);
}
}
这实际上不是完整的代码。我只提供必要的部分。 有人可以用变量 applyFilter 向我解释一下发生了什么。是关闭吗?如果它是一个闭包,这里使用一个闭包的目的是什么。任何帮助将受到高度赞赏。
编辑:我只需要知道除了使用函数调用之外是否还有其他特殊行为
答案 0 :(得分:2)
变量applyFilter
可以指向一个闭包或函数,它将CIImage
作为参数并返回CIImage
。在viewDidLoad()
方法中,这个变量实际上被设置为一个闭包,它只是调用另一个方法,向它传递正在传入的图像,并简单地返回该方法的返回值。所以在这种情况下,闭包是完全没必要的,因为它永远不会被设置为任何其他东西(除非你没有包含的代码中的某个地方,它会变成不同的东西)。在任何调用applyFilter
闭包的地方,只需拨打performRectangleDetection
即可。
现在,如果仍然需要保留applyFilter
,可能是因为您确实将其设置为代码中其他位置的其他内容,那么它在viewDidLoad()
中的使用仍然可以简化。 applyFilter
的签名与performRectangleDetection
的签名相同,因此代替您拥有的代码:
applyFilter = {
image in
return self.performRectangleDetection(image);
}
您只需将其替换为:
applyFilter = performRectangleDetection
这样做会使applyFilter
变量直接指向performRectangleDetection
方法,避免不必要的中间闭包。