来自JS,并试图在swift中通过引用传递[JSON],这是不可能的,所以我试图将它包装在对象中,并使用原语做了一个简单的例子,但仍然没有工作,我如何包装成员a,以便引用对象的变化影响b?感谢
class ExampleA {
var a = 0
init(a: Int) {
self.a = a
}
}
class ExampleB {
var a = 0
init(a: Int) {
self.a = a
}
func process(inout p: ExampleA) {
self.a = p.a
print(p.a)
}
}
var a = ExampleA(a: 15)
var b = ExampleB(a: 10)
b.process(&a)
print(b.a) // "15\n"
a.a = 25 // this does nothing to b????
print(b.a) // "15\n"
答案 0 :(得分:1)
您的示例失败,因为a
是Int
,这是一种值类型。
当您执行作业self.a = p.a
时,您正在复制Int。
要实现所需的引用语义,必须保持引用存储值类型的ExampleA
。我认为您因为变量命名而感到困惑,将a : Int
ExampleA
成员与名为ExampleA
的{{1}}实例混为一谈。
这是我放在一起的修复。它为a
提供了一个透明地访问ExampleB
中data
的计算属性。
ExampleA
答案 1 :(得分:0)
简单委托工作不需要inout
或引用语义:
class ExampleA {
var a = 0
init(a: Int) {
self.a = a
}
}
class ExampleB {
var aObject: ExampleA
init(a: ExampleA) {
self.aObject = a
}
func a() -> Int {
return aObject.a
}
}
var a = ExampleA(a: 15)
var b = ExampleB(a: a)
print(b.a())
a.a = 25
print(b.a())