2015-04-09 19 views
23

To pytanie było zadawane i odbierane przed użyciem NSSortDescriptor, gdzie jest to dość łatwe. Ale czy istnieje standardowa metoda Swift z użyciem Array.sort()?Sortowanie obiektów według dwóch właściwości

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

Sortowanie tablicę Sortables przez jedną właściwością jest prosta:

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

Ale chcę, aby posortować według isPriority następnie przez ordering - i nie mogę uzyskać moja głowa wokół prostego rachunku, aby to się stało.

Odpowiedz

33

Tak istnieje bardzo prosty sposób za pomocą kodu 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 
}) 

posortowanej tablicy:

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

Innym nieco krótsze rozwiązanie:

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

To bardzo dobrze, dziękuję. Może być napisany bardziej zwięźle - dodam do twojej odpowiedzi. – tobygriffin

+3

Moja edycja Twojej odpowiedzi została odrzucona, więc oto kod, którego użyłem. : Niech sortowania = array.sorted {t1, t2 in' 'jeśli t1.isPriority == t2.isPriority {' 'powrotu t1.ordering tobygriffin

+0

Nie powinno się "array.sorted' być" array.sort "? – Crashalot

11

Oto proste stwierdzenie to zrobić Sortowanie:

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

stworzyłem blogu o tym, jak to w Swift 3 i zachować prosty kod i czytelny.

Można go znaleźć tutaj:

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

Można również znaleźć repozytorium GitHub z kodem tutaj:

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

Istotą tego wszystkiego, powiedzmy, jeśli masz listę miejsc, będziesz w stanie to zrobić:

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 
     ) 
Powiązane problemy