按多个键值对数据进行排序
Posted
技术标签:
【中文标题】按多个键值对数据进行排序【英文标题】:Sorting data by multiple key values 【发布时间】:2015-07-07 19:39:03 【问题描述】:我有一个基本列表应用程序,其中包含两个实体 Folder
和 Item
具有一对多关系,文件夹子类有一个名为 itemsArray()
的函数,它返回排序数组中的 Items通过creationDate
显示UITableView
。
Item
有两个属性称为date
,类型为NSDate
,另一个属性为bool
,称为completed
。我创建了一个函数,可以在其中将单元格项目对象标记为已完成,这会将单元格文本颜色更改为灰色。
有没有办法也可以按其完成值对其进行排序?例如,completed
的值 true 或 false 应该分隔所有已完成的项目,然后还按 creationDate
对其进行排序。
最终结果应该是已完成项目位于UITableView
底部的位置,并且按日期顺序排列,未完成项目按日期顺序排列。好像完成的优先级高于日期,但仍按创建日期排序
这是我当前使用排序描述符返回数组的函数;
func itemsArray() -> [Item]
let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: true)
return checklist.sortedArrayUsingDescriptors([sortDescriptor]) as! [Item]
PS:我尝试了一些变通方法,例如将日期标记为已完成更新,因此它位于底部。这将已完成的项目与未完成的项目分开。但是,当取消标记该项目时,它仍保留在底部,这也不是一个好的长期解决方案,因为我可能想将排序更改为按字母顺序和完成。
【问题讨论】:
【参考方案1】:您可以在函数中添加另一个NSSortDescriptor
:
func itemsArray() -> [Item]
let sortByCompleted = NSSortDescriptor(key: "completed", ascending: true)
let sortByCreationDate = NSSortDescriptor(key: "creationDate", ascending: true)
return checklist.sortedArrayUsingDescriptors([sortByCompleted, sortByCreationDate]) as! [Item]
使用ascending
值首先获得true
或首先获得false
。或者 Swifty 的做事方式:
func itemsArray() -> [Item]
return checklist.sort
if $0.completed == $1.completed
return $0.creationDate < $1.creationDate
return $0.completed < $1.completed
【讨论】:
谢谢!我非常感谢这种快速的方式,我是 ios 新手,并且一直在尝试熟悉闭包。结果实际上分为三个完成组,然后意识到我在添加时从未设置过“false”值,因此在修复您的方法完美运行后,项目实际上具有默认值 nil (Y)以上是关于按多个键值对数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章