Arrays 将已排序数组恢复为其原始顺序

Arrays 将已排序数组恢复为其原始顺序,arrays,swift,sorting,uicollectionview,Arrays,Swift,Sorting,Uicollectionview,我正在对集合视图中的数据数组进行排序。我希望有3种方式对数据进行排序:字母顺序、数字顺序和根本不排序(根本不排序应该按照数据在模型中的设置方式对数据的顺序进行排序)。排序通过3个不同的UIButton进行 在我下面的代码中,AllanimalArray是在Collection视图中显示的完整数据数组 // Animal Name button pressed let sortAZ = allAnimalsArray.sorted(by: { $0.animalName < $1.anima

我正在对集合视图中的数据数组进行排序。我希望有3种方式对数据进行排序:字母顺序、数字顺序和根本不排序(根本不排序应该按照数据在模型中的设置方式对数据的顺序进行排序)。排序通过3个不同的UIButton进行

在我下面的代码中,AllanimalArray是在Collection视图中显示的完整数据数组

// Animal Name button pressed
let sortAZ = allAnimalsArray.sorted(by: { $0.animalName < $1.animalName })
allAnimalsArray = sortAZ
allAnimalsCollectionView.reloadData()

// Animal Weight button pressed
let sortByWeight = allAnimalsArray.sorted(by: { $0.pounds < $1.pounds })
allAnimalsArray = sortByWeight
allAnimalsCollectionView.reloadData()

// NO SORT button pressed
let noSorting = allAnimalsArray
allAnimalsArray = noSorting
allAnimalsCollectionView.reloadData()
//按下动物名称按钮
让sortAZ=allAnimalsArray.sorted(按:{$0.animalName<$1.animalName})
allAnimalsArray=sortAZ
AllanimalCollectionView.reloadData()
//动物体重按钮按下
让sortByWeight=allAnimalsArray.sorted(按:{$0.pounds<$1.pounds})
allAnimalsArray=排序权重
AllanimalCollectionView.reloadData()
//未按下排序按钮
设noSorting=allAnimalsArray
allAnimalsArray=noSorting
AllanimalCollectionView.reloadData()
我的问题是“无排序”方法不会更改排序。它保持与之前按下的顺序相同的顺序

这是我的理解。sort会复制数据,以便保留原始数据(而.sort会修改原始数据)


如何更改上面的“无排序”方法,以便只显示数据而不进行任何排序?(这意味着它将精确显示数据在模型中的设置方式)

如果原始数组没有可排序的顺序,那么我建议您永远不要修改原始数组。保留基于当前排序的第二个数组,并将此第二个数组用作集合视图数据模型的基础

当用户选择不同的排序方法时,只需从原始未修改的数组更新第二个数组,然后重新加载集合视图

let allAnimalsArray = ... // the original array that you never modify
var sortedArray = [YourAnimalClass]()
所有数据源方法都基于
sortedArray

如果用户选择“无排序”,则您可以:

sortedArray = allAnimalsArray
allAnimalsCollectionView.reloadData()
sortedArray.allAnimalsArray.sorted(by: { $0.whatever < $1.whatever })
allAnimalsCollectionView.reloadData()
如果用户选择其中一种排序,则执行以下操作:

sortedArray = allAnimalsArray
allAnimalsCollectionView.reloadData()
sortedArray.allAnimalsArray.sorted(by: { $0.whatever < $1.whatever })
allAnimalsCollectionView.reloadData()
sortedArray.allAnimalsArray.sorted(按:{$0.whater<$1.whater})
AllanimalCollectionView.reloadData()
您需要

  • 保存整个未排序数组的副本,并在需要恢复时使用
  • 或者至少保存该数组的索引,以便可以使用它们强制 原始未排序状态

  • 这很有帮助。但我没有改变所有的数据源方法,而是复制了未排序的数组。然后在No-Sort按钮方法中,我使用allAnimalsArray=originalSort。这仍然是相同的解决方案。您所做的只是使用不同的变量名。别忘了你可以投下有用的答案。