我有一个CLBeacon对象数组,它们都有一个属性.proximity。
我想通过包含CLProximity枚举的属性对数组进行排序。所以我希望所有对象都是立即,近,远,未知。
有没有办法在不诉诸一堆if语句的情况下巧妙地做到这一点?
答案 0 :(得分:14)
如果您定义sortIndex
CLProximity
extension CLProximity {
var sortIndex : Int {
switch self {
case .Immediate:
return 0
case .Near:
return 1
case .Far:
return 2
case .Unknown:
return 3
}
}
}
然后你可以用
对一系列信标进行排序let sortedBeacons = sorted(beacons) { $0.proximity.sortIndex < $1.proximity.sortIndex }
如果.Unknown
是唯一需要的CLProximity
值
&#34;特殊待遇&#34;并且所有其他可能的值都在期望值中
相对顺序,然后您可以简化属性定义
extension CLProximity {
var sortIndex : Int {
return self == .Unknown ? Int.max : rawValue
}
}
答案 1 :(得分:1)
您可以使用自定义比较器并使用它来对数组进行排序,
对于所有具有“未知”接近度的物体,您将“说”比其他物体“更大”
var sortedArray = persons.sortedArrayUsingComparator {
(obj1, obj2) -> NSComparisonResult in
if obj1.proximity.rawValue == obj12.proximity.rawValue {
return NSComparisonResult.OrderedSame
} else if obj1.proximity == .UNKNOWN || obj1.proximity.rawValue > obj12.proximity.rawValue {
return NSComparisonResult.OrderedDescending
}
return NSComparisonResult.OrderedAscending
}
答案 2 :(得分:0)
根据朱莉娅上面写的内容,我把它拼凑在一起:
Doctrine
全部谢谢!
答案 3 :(得分:0)
基于@Martin答案。 您还可以创建Int枚举并为其分配值,然后按如下所示对其进行排序。
enum myEnum: Int {
case A = 0
case B = 1
case C = 2
case D = 3
}
let myData : [myEnum:[String]] = [.C:["3"],.D:["4"],.B:["2"],.A:["1"]]
print(myData.first?.key)
let newData = myData.sorted(by: { $0.key.rawValue < $1.key.rawValue })
print(newData.first?.key)
希望这会有所帮助