swift:通过引用传递

时间:2016-06-10 19:48:08

标签: swift reference

来自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"

2 个答案:

答案 0 :(得分:1)

您的示例失败,因为aInt,这是一种值类型。

当您执行作业self.a = p.a时,您正在复制Int。

要实现所需的引用语义,必须保持引用存储值类型的ExampleA。我认为您因为变量命名而感到困惑,将a : Int ExampleA成员与名为ExampleA的{​​{1}}实例混为一谈。

这是我放在一起的修复。它为a提供了一个透明地访问ExampleBdata的计算属性。

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())