我正在开发一个iOS应用程序,我的数据存储在CoreData中,正在加载到UITableView中。数据实体有一个名为id的属性,它是一个字符串,包含一个A,后面跟着一个数字(即"A1“"A2”等。
当我使用这段代码进行排序时,我最终得到的是按字典顺序排序的表。"A1“、"A10”、"A11“、"A12”、"A2“、"A3”等)
let sortDescriptor = NSSortDescriptor(key: "id", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]我真正想要的是按数字排序,就像你可能期望的那样。我该怎么做呢?我知道可以将NSComparator作为参数添加到NSSortDescriptor中,但我无法在我的一生中弄清楚它。提前感谢您的帮助!
发布于 2015-05-31 07:16:55
(基于SQLite的) Core数据获取请求中的排序描述符不能使用自定义比较器,而只能使用有限的“内置”比较方法。获取谓词和排序描述符在“核心数据编程指南”中记录了这一点:
..。另一方面,SQL存储将谓词和排序描述符编译为SQL,并计算数据库本身中的结果。这主要是为了性能,但这意味着评估发生在非Cocoa环境中,因此依赖Cocoa的排序描述符(或谓词)无法工作。支持的排序选择器是
compare:和caseInsensitiveCompare:、localizedCompare:、localizedCaseInsensitiveCompare:和localizedStandardCompare:(后者是类似Finder的排序,以及大多数人大多数时间应该使用的)。此外,不能使用SQLite存储对瞬态属性进行排序。
幸运的是,有一个应该适合你的需求:
let sortDescriptor = NSSortDescriptor(key: "id", ascending: true,
selector: "localizedStandardCompare:")localizedStandardCompare:进行“查找类”比较,特别是根据数字值处理字符串中的数字。
对于SWIFT2.2/Xcode 7.3及更高版本:
let sortDescriptor = NSSortDescriptor(key: "id", ascending: true
selector: #selector(NSString.localizedStandardCompare))发布于 2019-03-29 22:36:01
为“迅速”4.2
可以使用NSSortDescriptor对数组进行排序
let descriptor: NSSortDescriptor = NSSortDescriptor(key: "lastMessageDate", ascending: false)
let sortedResults = arrChatDialogs?.sortedArray(using: [descriptor])发布于 2015-05-31 04:37:01
迅捷的方式:
var arr = ["A1", "A10", "A11", "A12", "A2", "A3"]
arr.sort {dropFirst($0).toInt() < dropFirst($1).toInt()}所以你可以直接使用它,或者用它作为比较器块的基础。如果您坚持在有效的目标C中这样做,您可以使用NSString compare:options:,其中options:包含NSNumericSearch。
https://stackoverflow.com/questions/30553843
复制相似问题