通过swift中的枚举值来排序对象数组

时间:2015-07-20 13:27:21

标签: xcode swift sorting

我有一个CLBeacon对象数组,它们都有一个属性.proximity。

我想通过包含CLProximity枚举的属性对数组进行排序。所以我希望所有对象都是立即,近,远,未知。

有没有办法在不诉诸一堆if语句的情况下巧妙地做到这一点?

4 个答案:

答案 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)

希望这会有所帮助