从过滤器列表和原始列表中删除项目
Remove item from filter list as well as from original list
我正在 Swift 4.0
上 UISearchBar
。我有 originalList[ModelItem]
和 filterList[ModelItem]
。在搜索时,假设用户想要删除 filterList 的第 5 个位置,这是实际 originalList 上的第 10 个项目。从两个列表中删除此项是否有意义,对吧?项目没有 ID 或类似类型字段。
这种双向删除的基本步骤是什么?我一直在寻找实现这一目标的总体思路。
如果模型是 class 并且 filterList
是直接从 originalList
创建的(没有创建新对象,但两个列表都引用相同的对象),那么你可以使用此代码:
let itemToDelete = filterList.remove(at: indexPath.row)
if let index = originalList.index(where: { [=10=] === itemToDelete }) {
originalList.remove(at: index)
}
print(originalList)
print(filterList)
===
运算符将测试实例的相等性,从而识别要从 originalList
.
中删除的正确实例
如果您使用 struct
作为模型,您将必须使用一些启发式方法来实现 Equatable
,即使没有明确的定义,这些启发式方法也能够检测两个实例是否相等标识符,然后使用 ==
在 originalList
中找到要删除的正确实例。
另一种选择可能是使用索引方法实现搜索,它将使用与当前过滤方法相同的过滤算法,但会多一个参数 - filterList
(filterIndex
) 中的索引连同过滤器文本,并基于此计算 return originalList
中与提供的一对过滤器文本和 filterIndex
.
匹配的索引
还有另一种选择,我不推荐它(我称之为 hack)——你可以保留一个从 originalList
到 filterList
的索引字典,你可以使用它来进行显式映射在 originalList
和 filterList
之间。然而,这将要求您始终更新该字典,无论对列表之一进行什么更改 - 每次搜索、每次删除或删除或插入都需要更新映射字典。这似乎很复杂且容易出错。
您有多种选择。
- 您可以维护原始和筛选项位置之间的映射,因此您可以对两个列表执行删除。
- 您可以让您的项目具有可识别性,这样您就可以在原始列表中搜索相应的项目并将其删除。请注意,可以测试所有引用类型的身份 (
===
)。
- 您可以使用过滤后的 "view" 原始列表,而不是过滤后的副本,因此将自然地在原始列表上执行删除。
我认为我们没有后一种选择的标准解决方案,这使得这种方法最复杂。
在选择前两个选项中的任何一个时,请注意在对过滤后的副本进行操作时可能发生的原始列表更新。
我正在 Swift 4.0
上 UISearchBar
。我有 originalList[ModelItem]
和 filterList[ModelItem]
。在搜索时,假设用户想要删除 filterList 的第 5 个位置,这是实际 originalList 上的第 10 个项目。从两个列表中删除此项是否有意义,对吧?项目没有 ID 或类似类型字段。
这种双向删除的基本步骤是什么?我一直在寻找实现这一目标的总体思路。
如果模型是 class 并且 filterList
是直接从 originalList
创建的(没有创建新对象,但两个列表都引用相同的对象),那么你可以使用此代码:
let itemToDelete = filterList.remove(at: indexPath.row)
if let index = originalList.index(where: { [=10=] === itemToDelete }) {
originalList.remove(at: index)
}
print(originalList)
print(filterList)
===
运算符将测试实例的相等性,从而识别要从 originalList
.
如果您使用 struct
作为模型,您将必须使用一些启发式方法来实现 Equatable
,即使没有明确的定义,这些启发式方法也能够检测两个实例是否相等标识符,然后使用 ==
在 originalList
中找到要删除的正确实例。
另一种选择可能是使用索引方法实现搜索,它将使用与当前过滤方法相同的过滤算法,但会多一个参数 - filterList
(filterIndex
) 中的索引连同过滤器文本,并基于此计算 return originalList
中与提供的一对过滤器文本和 filterIndex
.
还有另一种选择,我不推荐它(我称之为 hack)——你可以保留一个从 originalList
到 filterList
的索引字典,你可以使用它来进行显式映射在 originalList
和 filterList
之间。然而,这将要求您始终更新该字典,无论对列表之一进行什么更改 - 每次搜索、每次删除或删除或插入都需要更新映射字典。这似乎很复杂且容易出错。
您有多种选择。
- 您可以维护原始和筛选项位置之间的映射,因此您可以对两个列表执行删除。
- 您可以让您的项目具有可识别性,这样您就可以在原始列表中搜索相应的项目并将其删除。请注意,可以测试所有引用类型的身份 (
===
)。 - 您可以使用过滤后的 "view" 原始列表,而不是过滤后的副本,因此将自然地在原始列表上执行删除。
我认为我们没有后一种选择的标准解决方案,这使得这种方法最复杂。
在选择前两个选项中的任何一个时,请注意在对过滤后的副本进行操作时可能发生的原始列表更新。