是否可以将 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
}
}
多个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
}
}