简体   繁体   中英

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

I have two variables containing arrays of Core Image filters, but they're objects I don't fully understand (is it some kind of closure maybe?):

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

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

Later in the program I run through one or the other of these arrays with a for loop:

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

I'd like to be able to set another variable filterSetPicked to either filterSet or filterSetAlt so that I only need one for loop (right now I use an if-else to pick which loop to run so I have a bunch of duplicated code).

When I try var filterSetPicked = filterSet Xcode cries that ViewController.Type does not have a member named filterSet — I assume that's because of the filterSet syntax = { return [...] }() , which looks sort of like some example closures I've seen, but not exactly.

Edit: Here is a simplified version of what I was trying to do:

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

But it throws an error when trying to set var filterSetPicked = filterSet .

AFAIK, there's no need to wrap your arrays with expressions like in your example. You can simplify your declarations like this:

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

You may even be able to declare it without the type and let the compiler infer:

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

Then there's no problem to assign filterSet to another variable (I just tested in a Playground):

var filterSetPicked = filterSet

And for your loop you probably just need to get rid of self :

for eachFilter in filterSet {
    // do stuff
}

I still don't understand why what I was trying to do doesn't work, but I found a work around:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM