我有一个Contact个对象的数组:

var contacts:[Contact] = [Contact]()

联系人类别:

Class Contact:NSOBject {
    var firstName:String!
    var lastName:String!
}

我想把数组按lastName排序,然后再按firstName排序,以防一些联系人得到相同的lastName.

我可以根据其中一个标准进行排序,但不能同时根据这两个标准进行排序.

contacts.sortInPlace({$0.lastName < $1.lastName})

如何添加更多条件来对该数组进行排序?

推荐答案

想想"按多个标准排序"是什么意思.这意味着两个对象首先按照一个标准进行比较.然后,如果这些条件相同,则下一个条件将打破联系,依此类推,直到获得所需的顺序.

let sortedContacts = contacts.sort {
    if $0.lastName != $1.lastName { // first, compare by last names
        return $0.lastName < $1.lastName
    }
    /*  last names are the same, break ties by foo
    else if $0.foo != $1.foo {
        return $0.foo < $1.foo
    }
    ... repeat for all other fields in the sorting
    */
    else { // All other fields are tied, break ties by last name
        return $0.firstName < $1.firstName
    }
}

这里您看到的是Sequence.sorted(by:) method,它参考提供的闭包来确定元素的比较方式.

如果你的分类将在许多地方使用,那么最好是使你的类型符合Comparable protocol.这样,就可以使用Sequence.sorted() method,它会参考Comparable.<(_:_:) operator的实现来确定元素的比较方式.这样,您就可以对Contact中的任何Sequence进行排序,而无需复制排序代码.

Swift相关问答推荐

如何在init()中使用setter/getters?

SWIFT闭包使用的是陈旧的值,即使它是S@转义

try 从闭包访问返回的字符串时出现无法将类型 '()' 的返回表达式转换为返回类型 'String'编译器错误

是否可以使用一个 NSRegularExpression 同时判断字符串格式并提取子字符串?

物理主体未与 spritekit Swift 的网格图案上的纹理图像对齐

在 Swift 中将异步任务包装到 DispatchWorkItem 中以使其可取消?

避免 `(())` 显式指定 Void 类型的枚举关联值

如何在闭包中使用构造 await sync

TabView 无法在屏幕上正确显示

如何判断一个值是否为 Int 类型

无法分配给属性:absoluteString是一个只能获取的属性

调用从 SwiftUI 视图传递到 PageViewController.Coordinator 的函数

通用枚举菜单 SwiftUI

不支持用作符合协议 AnyObject 的具体类型

获取设备图像比例(例如@1x、@2x 和@3x)

Swift 动画 WithDuration 语法是什么?

try 在解除分配时加载视图控制器的视图... UIAlertController

如何在Swift中找出字母是字母数字还是数字

Swift 2.0 最低系统版本要求(部署目标)

在 xcode8 中找不到 ModuleName-Swift.h 文件