将nil Dates排序到数组的末尾

时间:2017-05-23 20:19:37

标签: swift sorting date optional

尝试按降序对Swift中的数组进行排序。这很好用

objectArray.sort{ $0.date!.compare($1.date!) == .orderedDescending}

如你所见,我强行打开约会。我正在寻找另一种方式,以便如果日期为nil,则对象移动到数组的末尾。

2 个答案:

答案 0 :(得分:11)

也许不是最干净的解决方案,但你可以通过零合并一步完成。

objectArray.sort{ ($0.date ?? .distantPast) > ($1.date ?? .distantPast) }

答案 1 :(得分:0)

这是一个如何将nil日期排序到数组末尾的示例。

在示例中,电影是电影类型的数组,具有日期属性。

let sortedMovies = movies.sorted { (movieA, movieB) -> Bool in

    switch (movieA.date, movieB.date) {
    case (.some, .some):
        return movieA.date! > movieB.date!

    case (.some, .none):
        return true

    case (.none, _):
        return false
    }
}

此功能有一些扩展,一个是非突变型,另一个是突变型,并带有用于降/升的参数。

extension Array
{
    func propertySorted<T: Comparable>(_ property: (Element) -> T?, descending: Bool) -> [Element]
    {
        sorted(by: {
            switch (property($0), property($1)) {
            case (.some, .some):
                return descending ? property($0)! > property($1)! : property($0)! < property($1)!

            case (.some, .none):
                return true

            case (.none, _):
                return false
            }
        })
    }

    mutating func propertySort<T: Comparable>(_ property: (Element) -> T?, descending: Bool)
    {
        sort(by: {
            switch (property($0), property($1)) {
            case (.some, .some):
                return descending ? property($0)! > property($1)! : property($0)! < property($1)!

            case (.some, .none):
                return true

            case (.none, _):
                return false
            }
       })
    }
}

用法:

let movieNames = movies.propertySorted({ $0.name }, descending: false)
let movieDates = movies.propertySorted({ $0.date }, descending: true)

movies.propertySort({ $0.name }, descending: false)
movies.propertySort({ $0.date }, descending: true)

扩展辅助功劳归@Sweeper解答Generic function to sort array of class by properties