这个 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
设置为 filterSet
或 filterSetAlt
以便我只需要一个 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)
}
}
}
我有两个包含 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
设置为 filterSet
或 filterSetAlt
以便我只需要一个 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)
}
}
}