Swift中的NSSortDescriptor

Chr*_*ich 9 ios swift

我正在开发一个iOS应用程序,我将数据存储在CoreData中,我将其加载到UITableView中.数据实体具有被称为属性的属性id,该属性是包含A后跟数字的字符串(即"A1""A2"等).

当我使用这个代码进行排序时,我最终会按字典顺序排序表(即"A1""A10""A11""A12""A2""A3"等)

let sortDescriptor = NSSortDescriptor(key: "id", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
Run Code Online (Sandbox Code Playgroud)

我真正想要的是它可以按照您的预期进行数字排序.我该怎么做呢?我知道NSComparator可以添加一个作为参数,NSSortDescriptor但我不能为我的生活弄清楚它.在此先感谢您的帮助!

Mar*_*n R 18

基于(基于SQLite)的核心数据获取请求中的排序描述符不能使用自定义比较器,而只能使用一组有限的"内置"比较方法.这在"核心数据编程指南" 中的 Fetch Predicates和Sort Descriptors中有记录:

...另一方面,SQL存储将谓词和排序描述符编译为SQL,并在数据库本身中评估结果.这主要是为了提高性能,但这意味着评估是在非Cocoa环境中进行的,因此依赖Cocoa的排序描述符(或谓词)无法工作.支持的种类选择是compare:caseInsensitiveCompare:,localizedCompare:, localizedCaseInsensitiveCompare:,和localizedStandardCompare:(后者是搜索类排序,和大多数人应该用大部分的时间).此外,您无法使用SQLite存储对瞬态属性进行排序.

幸运的是,有一个适合您的需求:

let sortDescriptor = NSSortDescriptor(key: "id", ascending: true,
                       selector: "localizedStandardCompare:")
Run Code Online (Sandbox Code Playgroud)

localizedStandardCompare: 进行"Finder-like"比较,特别是根据数字值处理字符串中的数字.

对于Swift 2.2/Xcode 7.3及更高版本:

let sortDescriptor = NSSortDescriptor(key: "id", ascending: true
                         selector: #selector(NSString.localizedStandardCompare))
Run Code Online (Sandbox Code Playgroud)