swift - 如何使用比较器签名创建 NSSortDescriptor?

标签 swift swift3 nssortdescriptor

我可以像这样创建一个不区分大小写的字符串排序描述符:

let titleSort = NSSortDescriptor(key: "title", ascending: true,
                                     selector: #selector(NSString.localizedCaseInsensitiveCompare))

我似乎无法弄清楚如何使用 comparator 签名:

class NSSortDescriptor {
  init(key: String?, ascending: Bool, comparator cmptr: @escaping Foundation.Comparator)
  ...
}

我是否必须从头开始创建一个新的比较器,或者 String 是否已经存在一些东西?

TIA

最佳答案

这里没有全局函数,因为 Comparator 旨在执行非内置的比较。它非常灵活,因为它允许您比较 2 种不同类型的对象并准确定义您希望它们如何排序。在一个关于如何对它们进行排序的非常简单的演示中,我创建了一个示例,首先检查传入的两个对象是否都是 String,如果不是,我就将它们视为应该排序的对象在同一水平。否则我按字母顺序对它们进行排序(不区分大小写,因为我将它们变成小写)。显然,您可以根据您预计需要排序的内容将其设置得尽可能复杂:

let descriptor = NSSortDescriptor(key: "title", ascending: true) { (string1, string2) -> ComparisonResult in
        guard let s1 = string1 as? String, let s2 = string2 as? String else {
            return ComparisonResult.orderedSame
        }
        if s1.lowercased() < s2.lowercased() {
            return ComparisonResult.orderedAscending
        } else if s1.lowercased() == s2.lowercased() {
            return ComparisonResult.orderedSame
        } else {
            return ComparisonResult.orderedDescending
        }
    }

关于swift - 如何使用比较器签名创建 NSSortDescriptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42726153/

相关文章:

ios - 如何对包含日期对象的自定义数组进行排序

ios - 如果是编辑风格,请重新设计 Tableview Cell

ios - 字典没有在 swift 5 中保存在 Userdefault 中

ios - Swift tableView.reloadRows 删除单元格

ios - iOS 屏幕几何布局是如何工作的?

iphone - iOS - 如何对从 CoreData 获取的托管对象进行排序?

swift - UITextField 在输入之前显示 "Optional("")"

ios - 我应该使用 tableViewController 还是常规 viewController 来重新创建提醒详细信息 View ?

ios - 如何使用 URL Swift 3 下载图像?

ios - 按字符串对对象数组进行排序