为什么这里使用闭包来设置着色器制服的值?

问题描述 投票:0回答:1

我正在查看 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
    }
}

我想知道它为什么以及如何工作。

swift closures gpuimage
1个回答
0
投票

属性

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)
© www.soinside.com 2019 - 2024. All rights reserved.