这段代码发生了什么 - IOS / Swift

时间:2016-02-08 17:57:35

标签: ios swift closures

我正在开发一个可以检测视频输入中矩形的相机应用程序,无论如何我找到了一个示例项目。但有一件事我仍然无法理解那里发生的事情。

以下是代码

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 向我解释一下发生了什么。是关闭吗?如果它是一个闭包,这里使用一个闭包的目的是什么。任何帮助将受到高度赞赏。

编辑:我只需要知道除了使用函数调用之外是否还有其他特殊行为

1 个答案:

答案 0 :(得分:2)

变量applyFilter可以指向一个闭包或函数,它将CIImage作为参数并返回CIImage。在viewDidLoad()方法中,这个变量实际上被设置为一个闭包,它只是调用另一个方法,向它传递正在传入的图像,并简单地返回该方法的返回值。所以在这种情况下,闭包是完全没必要的,因为它永远不会被设置为任何其他东西(除非你没有包含的代码中的某个地方,它会变成不同的东西)。在任何调用applyFilter闭包的地方,只需拨打performRectangleDetection即可。

现在,如果仍然需要保留applyFilter,可能是因为您确实将其设置为代码中其他位置的其他内容,那么它在viewDidLoad()中的使用仍然可以简化。 applyFilter的签名与performRectangleDetection的签名相同,因此代替您拥有的代码:

applyFilter = {
    image in
    return self.performRectangleDetection(image);
}

您只需将其替换为:

applyFilter = performRectangleDetection

这样做会使applyFilter变量直接指向performRectangleDetection方法,避免不必要的中间闭包。