这个 Swift 变量是什么,我如何用另一个变量指向它?

What is this Swift variable and how can I point to it with another variable?

我有两个包含 Core Image 过滤器数组的变量,但它们是我不完全理解的对象(可能是某种闭包吗?):

var filterSet: [CIFilter] = { return [CIFilter1(), CIFilter2(), CIFilter3()] }()

var filterSetAlt: [CIFilter] = { return [CIFilter4(), CIFilter5(), CIFilter6()] }() 

稍后在程序中,我 运行 使用 for 循环遍历其中一个数组:

for eachFilter in self.filterSet {
    // apply eachFilter to image

我希望能够将另一个变量 filterSetPicked 设置为 filterSetfilterSetAlt 以便我只需要一个 for 循环(现在我使用 if-else 选择哪个循环到 运行 所以我有一堆重复的代码)。

当我尝试 var filterSetPicked = filterSet 时,Xcode 告诉我 ViewController.Type 没有名为 filterSet 的成员 — 我认为这是因为 filterSet 语法 = { return [...] }(),这看起来有点像我见过的一些示例闭包,但不完全是。

编辑:这是我尝试做的事情的简化版本:

class CIColorChannel1: CIFilter {
    var inputImage: CIImage!
    override var outputImage: CIImage! {
        get {
            return CIFilter(name: "CIColorMatrix", withInputParameters: [
                kCIInputImageKey : inputImage,
                "inputRVector" : CIVector(x: 0, y: 0, z: 0),
                "inputGVector" : CIVector(x: 0, y: 0, z: 0),
                "inputBVector" : CIVector(x: 0, y: 0, z: 1),
                "inputBiasVector" : CIVector(x: 0, y: 0, z: 0),
                ]).outputImage
        }
    }
}

class CIColorChannel2: CIFilter {
    …
}    

class CIColorChannel3: CIFilter {
    …
}

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

    var filterSet = [CIColorChannel1(), CIColorChannel2()]
    var filterSetAlt = [CIColorChannel2(), CIColorChannel3()]
    var filterSetPicked = filterSet

    func shutterButton() {
        for eachFilter in self.filterSetPicked {
            // take photo, apply filters 
            // (this part already works if I just use filterSet or filterSetAlt directly)
        }
    }
}

但是在尝试设置 var filterSetPicked = filterSet 时会抛出错误。

AFAIK,没有必要像示例中那样用表达式包装数组。您可以像这样简化您的声明:

var filterSet: [CIFilter] = [CIFilter1(), CIFilter2(), CIFilter3()]

您甚至可以在没有类型的情况下声明它并让编译器推断:

var filterSet = [CIFilter1(), CIFilter2(), CIFilter3()]

然后将filterSet赋值给另一个变量就没有问题了(我刚刚在一个Playground上测试过):

var filterSetPicked = filterSet

对于您的循环,您可能只需要摆脱 self:

for eachFilter in filterSet {
    // do stuff
}

我仍然不明白为什么我尝试做的事情不起作用,但我找到了解决方法:

import UIKit
import AVFoundation

class CIColorChannel1: CIFilter {
    var inputImage: CIImage!
    override var outputImage: CIImage! {
        get {
            return CIFilter(name: "CIColorMatrix", withInputParameters: [
                kCIInputImageKey : inputImage,
                "inputRVector" : CIVector(x: 0, y: 0, z: 0),
                "inputGVector" : CIVector(x: 0, y: 0, z: 0),
                "inputBVector" : CIVector(x: 0, y: 0, z: 1),
                "inputBiasVector" : CIVector(x: 0, y: 0, z: 0),
                ]).outputImage
        }
    }
}

class CIColorChannel2: CIFilter {
    ...
}

class CIColorChannel3: CIFilter {
    ...
}

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

    var filterSet = [CIColorChannel1(), CIColorChannel2()]
    var filterSetAlt = [CIColorChannel2(), CIColorChannel3()]
    var filterSetPicked = []
    var filterSetting = true

    func shutterButton() {
        if self.filterSetting {
            self.filterSetPicked = self.filterSet
        } else {
            self.filterSetPicked = self.filterSetAlt
        }
        for eachFilter in self.filterSetPicked {
            // take photo, apply filters 
            // (this part already works if I just use filterSet or filterSetAlt directly)
        }
    }
}