2016-08-13 1 views
1

Iは、次ののViewControllerに格納された配列の多くを持っている: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 
    } 
} 

各インスタンスは、プロパティ(NSDateある)alarmTimeを有しています。時間に基づいて配列をソートするにはどうすればよいですか?

それをより明確にする:

それは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") 
] 

配列は、ソート関数とNSDateを処理するための特殊な構文を使用してソートできます。

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

最後に、この例では、sortedAlarmsalarmsにすべてが含まれていますが、alarmTimeにNSDateでソートされます。


アレイ内のデータに簡単にアクセスできます。たとえば、ソートされたアラーム配列の最初のアラームからアラーム時刻を取得するには、次のコードを使用します。アラームがソートされた後

let alarmTime = sortedAlarms[0].alarmTime 

は、あなたがtableView.reloadData()を使用して、テーブルビュー内のデータをリロードすることになるでしょう。

+0

本当に助けていただきありがとうございます! :) –

+0

Yw。うれしかった。 – Daniel