2015-04-09 7 views
23

Это было задано и ответили перед использованием NSSortDescriptor, где это довольно просто. Но есть ли быстрый способ с использованием Array.sort()?Сортировка массива объектов по двум свойствам

struct Sortable { 
    let isPriority: Bool 
    let ordering: Int 
} 

Сортировка массива Sortables одним свойством прост:

sort { $0.ordering < $1.ordering } 

Но я хочу, чтобы сортировать isPriority затем ordering - и я не могу получить мою голову вокруг простого заявления, чтобы сделать это происходит.

ответ

33

Да, есть очень простой способ с помощью Array.sort()

Код:

var sorted = array.sorted({ (s1, s2) -> Bool in 
    if s1.isPriority && !s2.isPriority { 
     return true //this will return true: s1 is priority, s2 is not 
    } 
    if !s1.isPriority && s2.isPriority { 
     return false //this will return false: s2 is priority, s1 is not 
    } 
    if s1.isPriority == s2.isPriority { 
     return s1.ordering < s2.ordering //if both save the same priority, then return depending on the ordering value 
    } 
    return false 
}) 

отсортированного массива:

true - 10 
true - 10 
true - 12 
true - 12 
true - 19 
true - 29 
false - 16 
false - 17 
false - 17 
false - 17 
false - 18 

Еще немного короче решение:

let sorted = array.sorted { t1, t2 in 
    if t1.isPriority == t2.isPriority { 
     return t1.ordering < t2.ordering 
    } 
    return t1.isPriority && !t2.isPriority 
} 
+0

Это очень хорошее спасибо. Его можно написать более кратко - я добавлю к вашему ответу. – tobygriffin

+3

Мое редактирование ответа было отклонено, так что вот код, который я использовал. 'пусть отсортированный = array.sorted {t1, t2 в' ' если t1.isPriority == t2.isPriority { '' вернуть t1.ordering tobygriffin

+0

Не следует ли 'array.sorted' быть' array.sort'? – Crashalot

11

Вот простое заявление, чтобы сделать эту сортировку:

var sorted = array.sort { $0.isPriority == $1.isPriority ? $0.ordering < $1.ordering : $0.isPriority && !$1.isPriority } 
0

Я создал запись в блоге о том, как это в Swift 3 и сохранить простой код и читаемый.

Вы можете найти его здесь:

http://master-method.com/index.php/2016/11/23/sort-a-sequence-i-e-arrays-of-objects-by-multiple-properties-in-swift-3/

Вы также можете найти хранилище GitHub с кодом здесь:

https://github.com/jallauca/SortByMultipleFieldsSwift.playground

Суть всего этого, скажем, если у вас есть список мест, вы сможете это сделать:

struct Location { 
    var city: String 
    var county: String 
    var state: String 
} 

var locations: [Location] { 
    return [ 
     Location(city: "Dania Beach", county: "Broward", state: "Florida"), 
     Location(city: "Fort Lauderdale", county: "Broward", state: "Florida"), 
     Location(city: "Hallandale Beach", county: "Broward", state: "Florida"), 
     Location(city: "Delray Beach", county: "Palm Beach", state: "Florida"), 
     Location(city: "West Palm Beach", county: "Palm Beach", state: "Florida"), 
     Location(city: "Savannah", county: "Chatham", state: "Georgia"), 
     Location(city: "Richmond Hill", county: "Bryan", state: "Georgia"), 
     Location(city: "St. Marys", county: "Camden", state: "Georgia"), 
     Location(city: "Kingsland", county: "Camden", state: "Georgia"), 
    ] 
} 

let sortedLocations = 
    locations 
     .sorted(by: 
      ComparisonResult.flip <<< Location.stateCompare, 
      Location.countyCompare, 
      Location.cityCompare 
     ) 
Смежные вопросы