2015-07-30 2 views
39

В Swift 2.0, как вы собираетесь сортировать массив пользовательских объектов по свойству? Я знаю в Swift 1.2, это было сделано с помощью sorted() и sort(). Однако эти методы больше не работают в Xcode 7 beta 4. Спасибо!Swift 2.0 Сортировка массива объектов по свойству

Например:

class MyObject: NSObject { 
    var myDate : NSDate 
} 

... 

let myObject1 : MyObject = MyObject() //same thing for myObject2, myObject3 

var myArray : [MyObject] = [myObject1, myObject2, myObject3] 

//now, I want to sort myArray by the myDate property of MyObject. 
+0

Всегда есть пузырь. – SalmonKiller

ответ

76

В Swift 2:

  • Вы можете использовать sort метод, с помощью compare для сравнения двух дат:

    let sortedArray = myArray.sort { $0.myDate.compare($1.myDate) == .OrderedAscending } // use `sorted` in Swift 1.2 
    
  • Или, если вы хотите отсортировать исходный массив, вы можете sortInPlace:

    myArray.sortInPlace { $0.myDate.compare($1.myDate) == .OrderedAscending } // use `sort` in Swift 1.2 
    

В Swift 3:

  • вернуть отсортированный исполнение массива, используйте sorted, не sort

    let sortedArray = myArray.sorted { $0.myDate < $1.myDate } 
    
  • разобраться на месте, теперь просто sort:

    myArray.sort { $0.myDate < $1.myDate } 
    

И с типом Swift 3's Date, вы можете использовать оператор <.

+0

Пример сортировки строк let myArray = ["Zen", "Step 12", "Apple"] let sortedArray = myArray.sort ({x, y in return x.localizedStandardCompare (y) == NSComparisonResult.OrderedAscending }) dump (sortedArray) – Abhijeet

+0

swift 3 не работает –

+0

The Swift 3 исполнение отлично работает. Я подозреваю, что что-то не так с вашим кодом. Если у вас все еще есть проблемы, отправьте свой собственный новый вопрос о переполнении стека с помощью [воспроизводимого примера вашей проблемы] (http://stackoverflow.com/help/mcve). – Rob

-2

рода теперь sortInPlace (или нечто подобное) с теми же параметрами, что и рода.

10

Если вы хотите отсортировать исходный массив пользовательских объектов. Вот еще один способ сделать это в Swift 2.1

var myCustomerArray = [Customer]() 
myCustomerArray.sortInPlace {(customer1:Customer, customer2:Customer) -> Bool in 
     customer1.id < customer2.id 
    } 

Где id целое. Вы можете использовать тот же оператор < для String.

Вы можете узнать больше о его использовании, глядя на пример здесь: Swift2: Nearby Customers

+0

Это может быть даже короче, я думаю. Использование $ 0 и $ 1 –

0

В стремительной 3.0

я принял предположение такой же, как в примере заданный в вопросе.

i.e customObject - это MyObject с переменной myDate. Массив MyObject - это myArray. Мы можем просто отсортировать его.

myArray.sort(by: { (one: MyObject, two: MyObject) -> Bool in 
    one. myDate < two. myDate 
}) 
Смежные вопросы