我有一个CLBeacon对象数组,这些对象都有一个属性.proximity。
我希望按照包含CLProximity枚举的这个属性对数组进行排序。所以,我希望所有对象按照IMMEDIATE、NEAR、FAR、UNKNOWN的顺序排列。
有没有一种简洁的方法可以做到这一点,而不必通过一堆if语句来实现?
我有一个CLBeacon对象数组,这些对象都有一个属性.proximity。
我希望按照包含CLProximity枚举的这个属性对数组进行排序。所以,我希望所有对象按照IMMEDIATE、NEAR、FAR、UNKNOWN的顺序排列。
有没有一种简洁的方法可以做到这一点,而不必通过一堆if语句来实现?
如果您定义了CLProximity
的一个(计算只读)属性sortIndex
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
值,而所有其他可能的值都按期望的相对顺序排列,则可以简化属性定义为
如果只有.Unknown
需要“特殊处理”,而其他所有可能的值都处于期望的相对顺序中,则可以将属性定义简化为:
extension CLProximity {
var sortIndex : Int {
return self == .Unknown ? Int.max : rawValue
}
}
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
}
Swift 5
现在你可以只需将Comparable添加到你的枚举类型中,它就会尊重顺序。
enum ContainerLevel: Comparable {
case empty
case almostEmpty
case halfFull
case almostFull
case full
}
//Are we running low?
let needMoreCoffee = coffeeMugLevel > .halfFull
print(needMoreCoffee) //true
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)
根据Julia上面写的,我把这个东西拼凑起来了:
self.beacons = beacons as! [CLBeacon]
var tempBeacons = zip(self.beacons, self.beacons.map({
(b: CLBeacon) -> Int in
if b.proximity == .Immediate {
return 0
} else if b.proximity == .Near {
return 1
} else if b.proximity == .Far {
return 2
} else if b.proximity == .Unknown {
return 3
}
return 0
}))
self.beacons = sorted(tempBeacons, {$0.1 < $1.1}).map({ $0.0 })
谢谢大家!