2016-06-10 239 views
0

来自JS,并试图在swift中通过引用传递[JSON],这是不可能的,所以我试图把它包装在对象中,并使用原语做了一个简单的例子,哪些仍然无法正常工作,我如何包装成员a,以便引用对象的变化影响b?感谢swift:传递参考

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

为什么它会影响'B'?更改'a.a'后不要调用'process'。 –

+1

你应该设置一些显式的委托结构来使值根据其他变化。他们不应该含蓄地“神奇地”改变他们的价值观。 – luk2302

+0

有没有办法引用类似于JS中的东西来反映变化立即作为引用对象中的值更改? –

回答

0

例如失败,因为aInt,这是一个值类型。

当您完成作业self.a = p.a时,您正在制作Int的副本。

要实现所需的引用语义,您必须持有引用存储值类型的ExampleA。我想你会因为你的变量命名而感到困惑,将ExampleAa : Int成员与名为aExampleA的实例混淆。

这是我整理的一个修复程序。它给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" 
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())