2015-07-20 5 views
2

У меня есть массив объектов CLBeacon, у которых есть свойство .proximity.Закажите массив объектов по значению их перечислений в swift

Я хочу заказать массив этим свойством, которое содержит перечисление CLProximity. Поэтому я хочу, чтобы все объекты были в порядке IMMEDIATE, NEAR, FAR, UNKNOWN.

Есть ли способ сделать это аккуратно, не прибегая к кучам утверждений if?

+0

Я думал о заказе rawValue, но в этом случае это даже не работает, потому что Unknown является первым в перечислении (и я хочу, чтобы оно было заказано последним). – Alper

+0

Простейшая вещь, о которой я могу сейчас подумать, - создать коллекцию, чтобы присвоить им значения int, которые вы можете сравнить. –

+0

. Какой будет код для этого быстро? Закрепить их цифрой? – Alper

ответ

13

Если определить а (только для чтения вычислен) свойство 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 значение, которое нуждается в «специальной обработки» и все другие возможные значения находятся в нужном относительном порядке, то вы можете упростить определение свойств для

extension CLProximity { 
    var sortIndex : Int { 
     return self == .Unknown ? Int.max : rawValue 
    } 
} 
+0

Это аккуратно, и я предпочел бы прикрепить правильные данные к CLProximity, хотя я не был уверен, как это сделать. – Alper

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 
} 
0

Основываясь на том, что Юлия написала выше, я собрал это вместе:

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 }) 

Спасибо всем!