【问题标题】:Swift didSet get index of arraySwift didSet 获取数组的索引
【发布时间】:2017-01-04 05:44:52
【问题描述】:

假设我有一个数组:

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

如果我执行intArray[2] = 10,我可以在didSet 中写入什么来打印修改值的索引(在这种情况下为2)?

【问题讨论】:

  • 这是不可能的,didSet 只能获取 newValue(array) 和 oldValue(array)。
  • 真的吗?有什么解决方法吗?
  • 没有内置的 Swift 方法可以做到这一点,尽管您可以编写这样的自定义解决方案:stackoverflow.com/a/27675375/6658553
  • @Daniel 您可以为Array 编写一个包装器,它转发所有方法调用,但根据需要截取索引
  • @nathan answer 让我满意 :) 不完全是我需要的,但我的程序很相似,我可以轻松调整我的代码

标签: swift swift3


【解决方案1】:

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]

它也适用于单个元素的更改,但数组会受到多次更改,因此获取更改索引的数组更安全。

【讨论】:

  • 有趣的想法。当然,这仅适用于就地修改,而不适用于插入和删除,因为插入/删除之后的每个元素都将被视为已更改。
  • 同意,它也不会发出删除元素索引的信号。它确实在 OP 声明的要求的有限范围内工作(从长远来看,他可能会发现这只是一个用例)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 2018-10-22
  • 2015-09-16
相关资源
最近更新 更多