【Swift5】配列の中身(数値・文字・日付)を比較してソートする方法【Xcode11】

2020年8月26日

Swift5では配列の要素を比較してソートすることが簡単にできます。

数値や文字はもちろん日付の比較でのソートも可能です。

もくじ

  1. 配列の中身の「数値」を比較してソート
  2. 配列の中身の「文字」を比較してソート
  3. 配列の中身の「日付」を比較してソート

1. 配列の中身の「数値」を比較してソート

class Data: NSObject {

    var num : Int!
    var string : String!
    var date : Date!
    
}
override func viewDidLoad() {
    super.viewDidLoad()

    var array : [Data] = []
    
    let data1 = Data()
    data1.num = 1
    array.append(data1)
    
    let data2 = Data()
    data2.num = 2
    array.append(data2)
    
    let data3 = Data()
    data3.num = 3
    array.append(data3)
    
    for data in array {
        print(data.num) // 1, 2, 3
    }
    
    array = array.sorted(by: { (a, b) -> Bool in
        return a.num > b.num
    })

    for data in array {
        print(data.num) // 3, 2, 1
    }
    
}

2. 配列の中身の「文字」を比較してソート

class Data: NSObject {

    var num : Int!
    var string : String!
    var date : Date!
    
}
override func viewDidLoad() {
    super.viewDidLoad()

    var array : [Data] = []
    
    let data1 = Data()
    data1.string = "a"
    array.append(data1)
    
    let data2 = Data()
    data2.string = "c"
    array.append(data2)
    
    let data3 = Data()
    data3.string = "b"
    array.append(data3)
    
    for data in array {
        print(data.string) // a, c, b
    }
    
    array = array.sorted(by: { (a, b) -> Bool in
        return a.string > b.string
    })

    for data in array {
        print(data.string) // c, b, a
    }
    
}

3. 配列の中身の「日付」を比較してソート

class Data: NSObject {

    var num : Int!
    var string : String!
    var date : Date!
    
}
class Data: NSObject {

    var num : Int!
    var string : String!
    var date : Date!
    
}
override func viewDidLoad() {
    super.viewDidLoad()

    var array : [Data] = []
    
    let data1 = Data()
    data1.date = Date.init(timeIntervalSince1970: 0) // 今の時間
    array.append(data1)
    
    let data2 = Data()
    data2.date = Date.init(timeIntervalSince1970: 60) // 1分後
    array.append(data2)
    
    let data3 = Data()
    data3.date = Date.init(timeIntervalSince1970: 60*60) // 1時間後
    array.append(data3)
    
    for data in array {
        print(data.date) // 1970-01-01 00:00:00, 1970-01-01 00:01:00, 1970-01-01 01:00:00
    }

    
    array = array.sorted(by: { (a, b) -> Bool in
        return a.date > b.date
    })

    for data in array {
        print(data.date) // 1970-01-01 01:00:00, 1970-01-01 00:01:00, 1970-01-01 00:00:00
    }
    
}