2016-06-10 430 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())