我在表视图中显示了一个自定义类型的元素数组。
每个元素都有属性,尤其是一个“级别”的元素(以Int为0、1、2或3)
我想做什么:
我想按级别对这些元素进行排序,但只在表视图的顶部显示级别3的元素,而忽略级别<3的其他元素。
我尝试过的事情:
-self.elements.sort(by: { $0.level! > $1.level! })
=>所有事件均已排序
-if element.level! > 2 {
self.elements.sort(by: { $0.level! > $1.level! })
}
=>无法正常工作
我真的不知道该怎么办...知道吗?
谢谢!
编辑
对不起,我可能不太清楚:
我有一个元素数组,我首先按与用户的距离排序,然后只希望第3级元素位于表格视图的顶部。
理想情况下,我希望这些3级元素也可以按距离排序。
->我想要的输出:按距离排序的元素,顶部为3级元素,我也希望按距离对这些3级元素进行排序
(抱歉,英语不是我的母语)
答案 0 :(得分:0)
尝试这个
self.elements.sort(by: { $0.level! > $1.level! })
var newArr = self.elements.filter({$0.level > 2})
答案 1 :(得分:0)
当您不得不处理这种可能反复发生且非常具体的操作时,建议您创建可重复使用的扩展。
有一个例子:
您的CustomClass(仅用于示例)
class CustomClass {
var text: String!
var level: Int!
convenience init(text: String, level: Int) {
self.init()
self.text = text
self.level = level
}
}
一个扩展方法模型(可以再次使用并进行修改)
extension Array where Element:CustomClass {
mutating func sortWithFilter(minLevel: Int) {
let list = self.sorted(by: { $0.level > $1.level})
self = list.filter( { $0.level > minLevel })
}
}
用法:
// Create array with your CustomClass
var array = [CustomClass]()
// Add some data
array.append(CustomClass(text: "info1", level: 1))
array.append(CustomClass(text: "info2", level: 3))
array.append(CustomClass(text: "info3", level: 2))
array.append(CustomClass(text: "info4", level: 3))
array.append(CustomClass(text: "info5", level: 0))
// Use our new extension method
array.sortWithFilter(minLevel: 2)
输出:
text : info2 , level : 3
text : info4 , level : 3
我希望这会有所帮助:)
答案 2 :(得分:0)
根据您的问题,您只需要显示3级对象,然后就无需对其进行排序,只需按以下所示过滤它们并完成即可。因为您只显示3级空白,其他对象将忽略
elements.filter({$0.level == 3})
答案 3 :(得分:0)
我设法通过将3级元素添加到另一个数组来实现这一点。然后,我按距离对两个数组进行排序,最后将它们组合在一起以在表视图中显示元素。
谢谢您的帮助!
答案 4 :(得分:0)
假设我们具有以下结构...
struct SomeStruct: CustomStringConvertible {
var level: Int
// create a random distance for demonstration
let distance = Double(arc4random_uniform(100))
var description: String {
return "Level: \(level), Distance: \(distance)"
}
}
还有这些结构的数组...
var arrayOfStructs = [
SomeStruct(level: 3),
SomeStruct(level: 1),
SomeStruct(level: 1),
SomeStruct(level: 2),
SomeStruct(level: 1),
SomeStruct(level: 3),
SomeStruct(level: 3),
SomeStruct(level: 2),
]
您可以使用以下条件对此数组进行排序:
arrayOfStructs.sort {
($0.level == 3 || $1.level == 3 && $0.level != $1.level) ? ($0.level == 3) : ($0.distance < $1.distance)
}
然后arrayOfStructs.forEach { print($0) }
得到以下结果:
Level: 3, Distance: 38.0
Level: 3, Distance: 60.0
Level: 3, Distance: 75.0
Level: 1, Distance: 15.0
Level: 2, Distance: 23.0
Level: 2, Distance: 52.0
Level: 1, Distance: 65.0
Level: 1, Distance: 78.0