2016-08-13 38 views
1

我有很多存储在以下的视图控制器阵列:在Swift中对协议数组进行排序?

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都应按警报时间排序。

+0

使用数组.sort函数? – Paulw11

回答

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") 
] 

该数组可以使用排序函数和一些特殊的句法来处理NSDates。

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

最后,在这个例子中,sortedAlarms包含一切alarms,但它是由在NSDate的排序alarmTime


可以很容易地访问数组中的数据。例如,要从排序的警报数组中的第一个警报获取警报时间,请使用以下代码。

let alarmTime = sortedAlarms[0].alarmTime 

报警进行分类后,你会想用tableView.reloadData()重新加载在你的表视图中的数据。

+0

谢谢,这真的有帮助! :) –

+0

Yw。很高兴它做到了。 – Daniel