是否可以将 class 实例变量指向 Swift 中的“inout”参数?

Is it possible to point class instance variables to `inout` parameters in Swift?

多个class方法是否可以访问和修改class构造函数中设置的单个inout参数?例如这样的事情:

class X {
    var mySwitch: Bool
    
    init(mySwitch: inout Bool) {
        self.mySwitch = mySwitch
    }
    
    func updateSwitch() {
        self.mySwitch.toggle() // this should toggle the external Boolean value that was originally passed into the init
  }
}

// usage
var myBool: Bool = false
let x = X(mySwitch: &myBool)
x.updateSwitch()
print(myBool) // this should read 'true'

简答:否

你的问题没有意义。 inout 参数允许您 read/write 在函数调用期间访问参数。一旦函数returns就没有意义了。您似乎认为它在作为 inout 传递的参数和其他一些变量之间创建了一些持久的 link。它没有。

你不能这样“link”一个变量,因为inout只在它声明的范围内工作。

如果你想要的是某种全局状态,你可以将它包装在 class.

class Wrapper {
    var value = false
    init() {}
}

class Modifier {
    let wrapper: Wrapper
    init(wrapper: Wrapper) {
        self.wrapper = wrapper
    }
    
    func updateSwitch() {
        wrapper.value.toggle()
    }
}

let wrapper = Wrapper()
let modifier = Modifier(wrapper: wrapper)
modifier.updateSwitch()
print(wrapper.value) // this will read 'true'

简答

没有

长答案

还有其他方法可以满足这一要求。

绑定变量

在 SwiftUI 中,我们使用绑定变量来做这样的事情。当绑定变量更新时,它也会更新绑定变量。我不确定它是否适用于 Sprite Kit。

class X {
    var mySwitch: Binding<Bool>

    init(_ someSwitch: Binding<Bool>) {
        self.mySwitch = someSwitch 
    }

   func toggle() { mySwitch.wrappedValue.toggle() }
}

struct Y {
    @State var mySwitch: Bool = false
    lazy var switchHandler = X($mySwitch)
} 

回调

我们可以向 X 添加回调并在布尔值的 didSet 上调用它。

class X {
    var mySwitch: Bool {
        didSet { self.callback(mySwitch) } // hands the new value back to the call site in Y
    }

    let callback: (Bool) -> Void

    init(_ someSwitch: Bool, _ callback: @escaping (Bool) -> Void) {
        self.mySwitch = someSwitch
        self.callback = callback
    }

    func toggle() { mySwitch = !mySwitch } // explicitly set to trigger didSet
}

class Y {
    var mySwitch: Bool = false
    lazy var switchHandler = X(mySwitch) {
        self.mySwitch = [=11=] // this is where we update the local value
    }
}