如何将过滤结果数组映射到原始数组(具有值语义)?

时间:2015-03-11 22:38:26

标签: ios swift

我实现了典型的文本过滤功能。我的类有一个数组,其中存储了所有原始值,另一个数组存储了过滤后的值,显示给用户。

然后,用户可以使用这些值进行处理(当它们被过滤时以及未被过滤时),例如,将状态设置为“已选择”。因此必须更新对象。

通常我会通过参考解决这个问题。所以我的2个数组引用了相同的对象,当我在当前显示的(已过滤的)结果中更改某些内容时,该对象也会在数组中使用原始值进行更新。非常简单......

但现在事实证明,最近版本的Swift将数组部分改为“仅限值”,因此我通过引用更新不起作用。如果我更新过滤后的数组中的对象A,则不会更新原始数组中的对象A.

另一方面,可以通过下标来更新:

array[i] = updatedObj

但是我还是要分别更新过滤的和原始的数组......我可以用只有索引而不是模型对象的列表来表示过滤后的数组,但是我不想这样做,因为谁知道,也许我想支持在某些时候诉诸结果,然后一切都被打破了。我知道我可以找到解决方案,但我怀疑有一个不同的,更好的解决方案。

最直接的方法是使用索引遍历过滤后的数组,然后遍历原始对象数组以查找匹配对象(使用==和/或某些id),然后通过设置更新对象在原始数组中下标。

这是安全的,但另一方面我正在开发一个移动应用程序,这不是非常友好。

过滤后的列表是其中一些用例,其中通过引用进行更新是合理的,因为过滤后的数组实际上只是原始数组顶部的“视图”。在Swift中是否有优雅/高性能的解决方案?

感谢。

1 个答案:

答案 0 :(得分:1)

也许我误解了你的问题。但是Swift Array仍然可以保存引用类型对象。您对过滤后的数组元素的更新会影响原始数组元素。

使用Swift 1.2 / Xcode版本6.3 Beta2(6D532l)

class Foo {
    var val = 0
}

let originalArray:[Foo] = [Foo(),Foo(), Foo(), Foo()]
let filteredArray:[Foo] = Array(originalArray[1...2])

filteredArray[0].val = 12
let obj = filteredArray[1]
obj.val = 42

originalArray[0].val // -> 0
originalArray[1].val // -> 12
originalArray[2].val // -> 42
originalArray[3].val // -> 0