Swift 3.1 Coredata 按字母升序排序,但保留以数字开头的记录

Posted

技术标签:

【中文标题】Swift 3.1 Coredata 按字母升序排序,但保留以数字开头的记录【英文标题】:Swift 3.1 Coredata Sorting Alphabetically Ascending but Keep Records Starting with Numbers in the Beginning 【发布时间】:2017-08-15 13:36:03 【问题描述】:

我在我的一个 ios 项目中使用了 coredata。我有一个名为“书籍”的表(列:标题、作者、状态、发布日期),我需要以一种按列标题以升序模式排序的方式获取记录。这是我为实现它而写的:

let fetchRequest = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Books")

let sort = NSSortDescriptor(key: "title", ascending: true)

fetchRequest.sortDescriptors = [sort]

do 
    let result = try coreViewContext.fetch(fetchRequest)
 catch let err as NSError 
    print(err.debugDescription)

如果我有一些标题为“100 个故事、20 部电影、300 个男人”的书怎么办?我希望这些标题位于结果数组的开头。目前,此类记录介于两者之间。

【问题讨论】:

【参考方案1】:

我建议将 CoreData 结果转换为实现自定义排序功能的书籍对象数组(我假设您最终还是会这样做)。类似于下面的函数:

static func sortByTitle(books: [Book]) -> [Book]
    return books.sorted(by: sorterForTitlesAlphaNumeric)

sorterForTitlesAlphaNumeric 的实现如下所示:

//Compare this book's title to that book's title
static func sorterForTitlesAlphaNumeric(this : Book, that: Book) -> Bool 
    return this.title < that.title

与尝试使用预烘焙的NSSortDescriptor 相比,这将为您提供更精细的粒度控制。这样,如果以后您决定根据标题进行过滤,然后发布日期,您可以将上述功能更改为

    //Compare this book's title to that book's title
static func sorterForTitlesAlphaNumeric(this : Book, that: Book) -> Bool 
    if this.title == that.title 
        return this.publishDate < that.publishDate 
    
    return this.title < that.title

【讨论】:

以上是关于Swift 3.1 Coredata 按字母升序排序,但保留以数字开头的记录的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 在 CoreData 中按字母顺序获取记录

php和mysql排序问题

按升序或降序对数字或字母进行通用排序

order by 升序排序是null字段如何排在最后?

核心数据按升序获取最后 20 条记录?

以最快的方式重新排序字母以按字典顺序排在第一位