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.