来自JS,并试图通过引用传递JSON,这是不可能的,所以我尝试将它包装在对象中,并使用一个仍然不起作用的原语做了一个简单的示例,如何包装成员a,从而更改引用的对象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"发布于 2016-06-10 20:04:24
您的示例失败,因为a是一个Int,它是一个值类型。
当您做作业self.a = p.a时,您正在制作Int的副本。
要实现所需的引用语义,您必须保存用于存储值类型的引用( ExampleA )。我认为您因为变量命名而感到困惑,混淆了ExampleA的a : Int成员和名为a的ExampleA实例。
这是我安排好的解决办法。它为ExampleB提供了一个计算属性,它透明地访问ExampleA中的data。
class ExampleA {
var data = 0
init(data: Int) {
self.data = data
}
}
class ExampleB {
var a : ExampleA
var data : Int {
get {
return a.data
}
set {
a.data = newValue
}
}
init(data: Int) {
self.a = ExampleA(data: data)
}
func process(a: ExampleA) {
self.a = a
print(a.data)
}
}
var a = ExampleA(data: 15)
var b = ExampleB(data: 10)
b.process(a: a)
print(b.data) // "15\n"
a.data = 25
print(b.data) // "25\n"发布于 2016-06-10 20:08:02
简单的委托不需要任何实际的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())https://stackoverflow.com/questions/37756087
复制相似问题