尝试按降序对Swift中的数组进行排序。这很好用
objectArray.sort{ $0.date!.compare($1.date!) == .orderedDescending}
如你所见,我强行打开约会。我正在寻找另一种方式,以便如果日期为nil
,则对象移动到数组的末尾。
答案 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