这是一个如何将 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 的回答提供扩展援助信用