尝试在Swift中按降序对数组进行排序。 这很有效
objectArray.sort{ $0.date!.compare($1.date!) == .orderedDescending}
正如您所见,我正在强制解包日期。我正在寻找另一种方法,以便如果日期是nil
,则对象将移动到数组的末尾。
尝试在Swift中按降序对数组进行排序。 这很有效
objectArray.sort{ $0.date!.compare($1.date!) == .orderedDescending}
正如您所见,我正在强制解包日期。我正在寻找另一种方法,以便如果日期是nil
,则对象将移动到数组的末尾。
可能不是最干净的解决方案,但你可以使用空合并运算符在一步中完成它。
objectArray.sort{ ($0.date ?? .distantPast) > ($1.date ?? .distantPast) }
sort { ($0.date ?? .distantPast) > ($1.date ?? .distantPast) }
- Martin Rlet 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 在 按属性排序类数组的通用函数 上的回答,提供了扩展帮助。