假設我有一個數組:斯威夫特didSet得到數組的索引
var intArray: [Int] = [1,2,3,4,5] {
didSet{
//print index of value that was modified
}
}
如果我這樣做intArray[2] = 10
,我能寫裏面didSet
以打印修改後的值的索引(2,在這種情況下) ?
假設我有一個數組:斯威夫特didSet得到數組的索引
var intArray: [Int] = [1,2,3,4,5] {
didSet{
//print index of value that was modified
}
}
如果我這樣做intArray[2] = 10
,我能寫裏面didSet
以打印修改後的值的索引(2,在這種情況下) ?
這個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]
它也適用於單個元素的變化,但陣列受到多重變化,從而它的安全得到改變指標陣列。
有趣的想法。當然,這隻適用於原地修改,不適用於插入和刪除,因爲插入/刪除後的每個元素都會被視爲已更改。 – devios1
同意,也不會表示已刪除的元素索引。它確實在OP所述要求的有限範圍內工作(從長遠來看,他可能會發現這只是一個用例)。 –
偉大的作品:) thx –
這是不可能的,用'didSet'你只能得到newValue(array)和oldValue(array)。 –
真的嗎?有沒有解決方法? – Daniel
有沒有內置的Swift方式來做到這一點,雖然你可以寫這樣的自定義解決方案:http://stackoverflow.com/a/27675375/6658553 – nathan