通过引用返回swift
以以下为例:通过引用返回swift,swift,Swift,以以下为例: struct Foo { var bar: Int = 0 } func getBar (forFoo foo: Foo) -> Int { return foo.bar } let foo = Foo() var bar = getBar(forFoo: foo) bar = 1 print("foo.bar: \(foo.bar)") 在getBar中,我希望能够返回对foo.bar的引用,以便当我修改bar时,它会更改foo.bar的值,而不仅仅是
struct Foo {
var bar: Int = 0
}
func getBar (forFoo foo: Foo) -> Int {
return foo.bar
}
let foo = Foo()
var bar = getBar(forFoo: foo)
bar = 1
print("foo.bar: \(foo.bar)")
在getBar
中,我希望能够返回对foo.bar
的引用,以便当我修改bar
时,它会更改foo.bar
的值,而不仅仅是bar
我该怎么做呢?在对它进行了一点尝试之后,它看起来好像
NSNumber
实际上也不能满足您的需要,因此您需要编写自己的自定义包装器。例如:
struct Foo {
let bar = IntWrapper(0)
}
class IntWrapper {
var value: Int
init (_ value: Int) {
self.value = value
}
}
func getBar (forFoo foo: Foo) -> IntWrapper {
return foo.bar
}
let foo = Foo()
let bar = getBar(forFoo: foo)
bar.value = 1
print("foo.bar: \(foo.bar.value)") // prints 1
请注意,我将一些
var
s更改为let
,因为如果要更改引用本身,您只需要在引用类型上使用var
。int是一个结构,因此它不是引用类型,但NSNumber是您不能使用的。如果需要引用,则必须使用引用类型。最好使用像NSNumber这样的包装类。好的,谢谢。结构也不能这样做吗?不,结构是值类型。但是,如果结构的一个属性是类,您仍然可以获得对它的引用。但是,在某个时候,如果不使用类,就无法做到这一点。好的,谢谢你的帮助:)