在 Swift 中对协议数组进行排序?

Posted

技术标签:

【中文标题】在 Swift 中对协议数组进行排序?【英文标题】:Sort arrays of protocols in Swift? 【发布时间】:2016-08-13 02:57:28 【问题描述】:

我有很多数组存储在以下 ViewController 中:

protocol AlarmClockType 
    var alarmLabel: String  get set 
    var sound: AlarmSound  get set 
    var snooze: Bool  get set 
    var alarmType: AlarmType  get set 
    var alarmOn: Bool  get set 
    var alarm: NSTimer?  get set 
    var attributedTitle: NSMutableAttributedString  get 

    static var DocumentsDirectory: NSURL  get 
    static var ArchiveURL: NSURL  get 

    func timeToAlarm(prayerTimes: [String: String]?) -> NSDate
    

每个实例都有一个属性 alarmTime(即 NSDate)。如何根据时间对数组进行排序?

为了更清楚:

这是一个 TableViewController,单元格显示警报时间。用户每次添加闹钟,tableView都要按照闹钟时间排序。

【问题讨论】:

使用数组.sort函数? 【参考方案1】:

如果您想按日期对数组进行排序,最好使用包含 NSDate 的自定义数据结构。

例如,您可以创建一个具有数据属性的结构。

struct Alarm 
    var alarmTime: NSDate = NSDate()
    var description: String = ""

这个结构可以用来创建一个数组。

let alarms = [
    Alarm(alarmTime: NSDate().dateByAddingTimeInterval(120),
          description: "alarm 60 s in the future"), 
    Alarm(alarmTime: NSDate().dateByAddingTimeInterval(30),
           description: "alarm 30 s in the future"), 
    Alarm(alarmTime: NSDate().dateByAddingTimeInterval(90),
          description: "alarm 90 s in the future")
]

可以使用 sort 函数和一些用于处理 NSDates 的特殊语法对数组进行排序。

let sortedAlarms = alarms.sort(
     $0.alarmTime.compare($1.alarmTime) == NSComparisonResult.OrderedAscending 
)

最后,在本例中,sortedAlarms 包含 alarms 中的所有内容,但它是按 alarmTime 中的 NSDate 排序的。


可以轻松访问数组中的数据。例如,要从排序后的闹钟数组中的第一个闹钟中获取闹钟时间,请使用以下代码。

let alarmTime = sortedAlarms[0].alarmTime

警报排序后,您需要使用tableView.reloadData() 重新加载表格视图中的数据。

【讨论】:

谢谢你,这真的很有帮助! :)

以上是关于在 Swift 中对协议数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中对对象数组进行排序?

如何在 Swift 5 中对数组的数组进行排序 [关闭]

如何在swift 4中对数组中的JSON数据进行排序

如何在 Swift 中对 NSDate 进行排序

如何在Swift 5中对[int:String]的字典进行排序[重复]

在 Swift 中对 NSDictionary 对象的 NSArray 进行排序