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 按字母升序排序,但保留以数字开头的记录的主要内容,如果未能解决你的问题,请参考以下文章