将空日期排在数组末尾的排序方法

12

尝试在Swift中按降序对数组进行排序。 这很有效

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

正如您所见,我正在强制解包日期。我正在寻找另一种方法,以便如果日期是nil,则对象将移动到数组的末尾。


日期是否可能为“nil”?应用程序会崩溃吗?如果不会,考虑将“date”属性声明为非可选项。 - vadian
@vadian 是的,我不想让我的客户端崩溃。相反,需要正确处理来自Web服务的nil数据。 - CalZone
2个回答

23

可能不是最干净的解决方案,但你可以使用空合并运算符在一步中完成它。

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

6
稍微简单一点:sort { ($0.date ?? .distantPast) > ($1.date ?? .distantPast) } - Martin R
谢谢@MartinR和John,这就解决了。 - CalZone

0
这是一个示例,演示如何将空日期排序到数组的末尾。
在这个示例中,movies是一个Movie类型的数组,其中包含一个date属性。
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 在 按属性排序类数组的通用函数 上的回答,提供了扩展帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接