【问题标题】:Sorting nil Dates to the end of an Array将 nil 日期排序到数组的末尾
【发布时间】:2017-05-23 20:19:37
【问题描述】:

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

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

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

【问题讨论】:

  • 日期可以是nil吗?应用程序会崩溃吗?如果不是,请考虑将date 属性声明为非可选。
  • @vadian 是的,我不希望我的客户应用程序崩溃。而是需要正确处理来自 Web 服务的 nil 数据。

标签: swift sorting date optional


【解决方案1】:

也许不是最干净的解决方案,但您可以使用 nil-coalescing 一步完成。

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

【讨论】:

  • 稍微简单一点:sort { ($0.date ?? .distantPast) > ($1.date ?? .distantPast) }
  • 感谢@MartinR,约翰,成功了。
【解决方案2】:

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

在这个例子中,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 为Generic function to sort array of class by properties 的回答提供扩展援助信用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多