2015-08-31 21 views
8

我想知道「didSet」是否適用於數組中的元組。「didSet」是否適用於數組中的元組?

我寫了類似下面的代碼,我想觀察數組內的值。它可以做這種事情嗎?

var array :[(foo: Int, bar: Int)] = []]{ 
    didSet{ 
     // println code 
    } 
} 

init(){ 
    var tuple = (foo: 0, bar:0) 
    array = Array(count: 16, repeatedValue: tuple) 
} 

// change the value somewhere in the code 
// and for example, want to println just only (and when) the value changed 
array[3].foo = 100 

回答

8

是它的工作原理:

var array : [(foo: Int, bar: Int)] = [] { 
    didSet { 
     println("~~~~~~") 
    } 
} 

let tup = (foo: 0, bar: 42) 
array.append(tup) 

println(array) 
array[0].foo = 33 
println(array) 

didSet被每個所述陣列被修改時執行,如預期:

~~~~~~
[(0,42 )]
~~~~~~
[(33,42)]


如果你想知道更改後的值,用 「didSet」 + 「屬性oldValue」 和/或 「willSet」 + 「NEWVALUE」:

var array : [(foo: Int, bar: Int)] = [] { 
    willSet { 
     println(newValue) 
    } 
    didSet { 
     println(oldValue) 
    } 
} 

let tup = (foo: 0, bar: 42) 
array.append(tup) 
array[0].foo = 33 

[(0,42) ]
[]
[(33,42)]
[(0,42)]

newValueoldValue都是由Swift生成的變量。當數組被修改時,將調用「willSet」和「didSet」。

UPDATE:

您可以訪問後面newValueoldValue實際的對象。例如:

var array : [(foo: Int, bar: Int)] = [] { 
    willSet { 
     println(newValue[0].foo) 
    } 
    didSet { 
     if oldValue.count > 0 { 
      println(oldValue[0].foo) 
     } else { 
      println(oldValue) 
     } 

    } 
} 

let tup = (foo: 0, bar: 42) 
array.append(tup) 
array[0].foo = 33 
+0

謝謝你的回答! 在這段代碼中,我想打印改變的值:例如:只是數組[3] .foo。 – i77k

+0

不客氣。 :) – Moritz

+0

@ i77k更新了我的答案。 – Moritz

相關問題