2017-01-04 51 views
2

假設我有一個數組:斯威夫特didSet得到數組的索引

var intArray: [Int] = [1,2,3,4,5] { 
    didSet{ 
     //print index of value that was modified 
    } 
} 

如果我這樣做intArray[2] = 10,我能寫裏面didSet以打印修改後的值的索引(2,在這種情況下) ?

+1

這是不可能的,用'didSet'你只能得到newValue(array)和oldValue(array)。 –

+0

真的嗎?有沒有解決方法? – Daniel

+1

有沒有內置的Swift方式來做到這一點,雖然你可以寫這樣的自定義解決方案:http://stackoverflow.com/a/27675375/6658553 – nathan

回答

5

這個zip()函數可以爲這個有用:

class A 
{ 
    var array = [1,2,3,4,5] 
    { 
    didSet 
    { 
     let changedIndexes = zip(array, oldValue).map{$0 != $1}.enumerated().filter{$1}.map{$0.0} 
     print("Changed indexes: \(changedIndexes)") 
    } 
    } 
} 

let a = A() 
a.array = [1,2,7,7,5] 

// prints: Changed indexes: [2, 3] 

它也適用於單個元素的變化,但陣列受到多重變化,從而它的安全得到改變指標陣列。

+0

有趣的想法。當然,這隻適用於原地修改,不適用於插入和刪除,因爲插入/刪除後的每個元素都會被視爲已更改。 – devios1

+0

同意,也不會表示已刪除的元素索引。它確實在OP所述要求的有限範圍內工作(從長遠來看,他可能會發現這只是一個用例)。 –

+0

偉大的作品:) thx –