我正在查看 GPUImage3, 我的问题是为什么这里使用闭包而不是直接赋值
public class LuminanceThreshold: BasicOperation {
public var threshold:Float = 0.5 { didSet { uniformSettings["threshold"] = threshold } }
public init() {
super.init(fragmentFunctionName: "thresholdFragment", numberOfInputs:1)
({threshold = 0.5})() //this line
}
}
我想知道它为什么以及如何工作。
属性
threshold
有一个 didSet
属性观察器,规则是当观察到的属性在初始化器中赋值时永远不会触发它们。
但是,通过从在 init 内部执行的闭包中分配属性,观察者
didSet
将被触发。
通过执行上述代码并与直接赋值
threshold
时进行比较,可以轻松验证这一点。
在第一种情况下
uniformSettings["threshold"]
是0.5,但在第二种情况下它仍然是0.3。
下面是我的测试代码
class BasicOperation {
var uniformSettings:[String: Float] = ["threshold": 0.3]
init(fragmentFunctionName: String, numberOfInputs: Int) {}
}
class LuminanceThreshold: BasicOperation {
var threshold:Float = 0.5 {
didSet {
uniformSettings["threshold"] = threshold
}
}
public init() {
super.init(fragmentFunctionName: "thresholdFragment", numberOfInputs:1)
//threshold = 0.5 <-- this will give 0.3
({threshold = 0.5})() // this will give 0.5
}
}
let threshold = LuminanceThreshold()
print(threshold.threshold)
print(threshold.uniformSettings)