26 Вопрос: Как мне отсортировать NSMutableArray с пользовательскими объектами в нем?

вопрос создан в Tue, Nov 28, 2017 12:00 AM

То, что я хочу сделать, кажется довольно простым, но я не могу найти ответы в Интернете. У меня есть NSMutableArray объектов, и предположим, что они являются объектами «Персона». Я хочу отсортировать NSMutableArray по Person.birthDate, который является NSDate.

Я думаю, что это как-то связано с этим методом:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

В Java я хотел бы, чтобы мой объект реализовывал Comparable, или использовал Collections.sort со встроенным пользовательским компаратором ... как же это сделать в Objective-C?

    
1234
26 ответов                              26                         

Метод сравнения

Либо вы реализуете метод сравнения для вашего объекта:

- (NSComparisonResult)compare:(Person *)otherObject {
    return [self.birthDate compare:otherObject.birthDate];
}

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];

NSSortDescriptor (лучше)

или обычно даже лучше:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                           ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

Вы можете легко сортировать по нескольким ключам, добавив более одного в массив. Использование пользовательских методов сравнения также возможно. Ознакомьтесь с документацией . р>

Блоки (блестящие!)

Существует также возможность сортировки по блокам начиная с Mac OS X 10.6 и iOS 4:

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDate *first = [(Person*)a birthDate];
    NSDate *second = [(Person*)b birthDate];
    return [first compare:second];
}];

Производительность

Методы -compare: и основанные на блоках будут в целом немного быстрее, чем использование NSSortDescriptor, поскольку последний зависит от KVC. Основное преимущество метода NSSortDescriptor заключается в том, что он позволяет определять порядок сортировки с помощью данных, а не кода, что упрощает, например, настроить все так, чтобы пользователи могли сортировать NSTableView, щелкнув строку заголовка.

    

2269
2017-06-12 14: 50: 16Z
  1. В первом примере есть ошибка: вы сравниваете переменную экземпляра birthDate в одном объекте с самим другим объектом, а не с его переменной birthDate.
    2011-05-17 08: 52: 53Z
  2. @ Мартин: Спасибо! Забавно, что никто не заметил, прежде чем я получил 75 голосов за это.
    2011-05-17 11: 18: 17Z
  3. Поскольку это принятый ответ, и поэтому, вероятно, большинство пользователей считают его окончательным, может быть полезно добавить третий пример на основе блоков, чтобы пользователи были в курсе он тоже существует.
    2011-12-02 20: 30: 26Z
  4. @ orange80: я пробовал это. У меня больше нет Mac, поэтому было бы неплохо, если бы вы посмотрели код.
    2011-12-04 20: 25: 21Z
  5. Если у вас есть NSMutableArray, я предпочитаю использовать методы sortUsingDescriptors, sortUsingFunction или sortUsingSelector. Поскольку копирование массива обычно не требуется, я обычно не нуждаюсь в копии. /DIV>
    2012-08-06 06: 01: 43Z

    См. метод NSMutableArray sortUsingFunction:context:

    Вам потребуется настроить функцию compare , которая принимает два объекта (типа Person, поскольку вы сравниваете два объекта Person) и параметр context . р>

    Два объекта являются просто экземплярами Person. Третий объект - это строка, например, @ "РОЖДЕНИЕ".

    Эта функция возвращает NSComparisonResult: она возвращает NSOrderedAscending, если PersonA.birthDate < PersonB.birthDate. Он вернет NSOrderedDescending, если PersonA.birthDate > PersonB.birthDate. Наконец, он вернет NSOrderedSame, если PersonA.birthDate == PersonB.birthDate.

    Это грубый псевдокод; вам нужно будет уточнить, что означает, что одна дата «меньше», «больше» или «равна» другой дате (например, сравнение секунд с момента начала и т. д.):

    NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
      if ([firstPerson birthDate] < [secondPerson birthDate])
        return NSOrderedAscending;
      else if ([firstPerson birthDate] > [secondPerson birthDate])
        return NSOrderedDescending;
      else 
        return NSOrderedSame;
    }
    

    Если вы хотите что-то более компактное, вы можете использовать троичные операторы:

    NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
      return ([firstPerson birthDate] < [secondPerson birthDate]) ? NSOrderedAscending : ([firstPerson birthDate] > [secondPerson birthDate]) ? NSOrderedDescending : NSOrderedSame;
    }
    

    Встраивание может немного ускорить это, если вы будете делать это много.

        
    107
    2016-06-13 17: 21: 52Z
    1. Использование sortUsingFunction: context: является, вероятно, наиболее точным способом и определенно самым нечитаемым.
      2009-04-30 06: 28: 40Z
    2. Что не так с подходом "c-ish"? Работает нормально.
      2009-04-30 06: 32: 13Z
    3. В этом нет ничего плохого, но я думаю, что теперь есть гораздо лучшие альтернативы.
      2009-04-30 06: 43: 54Z
    4. Возможно, но я не думаю, что это было бы менее читабельным для кого-либо из фона Java, который может искать что-то похожее на абстрактный класс Java Comparator, который реализует сравнить (введите obj1, введите obj2).
      2009-04-30 06: 51: 51Z
    5. Мне кажется, что некоторые из вас ищут любую причину для того, чтобы критиковать этот прекрасный ответ, даже если эта критика имеет очень мало технических достоинств. Weird.
      2009-05-01 17: 59: 13Z

    Я сделал это в iOS 4, используя блок. Пришлось привести элементы моего массива из id к типу моего класса. В данном случае это был класс Score с свойством points.

    Также вам нужно решить, что делать, если элементы вашего массива имеют неправильный тип, для этого примера я только что возвратил NSOrderedSame, однако в моем коде я являюсь исключением.

    NSArray *sorted = [_scores sortedArrayUsingComparator:^(id obj1, id obj2){
        if ([obj1 isKindOfClass:[Score class]] && [obj2 isKindOfClass:[Score class]]) {
            Score *s1 = obj1;
            Score *s2 = obj2;
    
            if (s1.points > s2.points) {
                return (NSComparisonResult)NSOrderedAscending;
            } else if (s1.points < s2.points) {
                return (NSComparisonResult)NSOrderedDescending;
            }
        }
    
        // TODO: default is the same?
        return (NSComparisonResult)NSOrderedSame;
    }];
    
    return sorted;
    

    PS: это сортировка по убыванию.

        
    61
    2013-06-03 07: 22: 00Z
    1. Вам на самом деле не нужны приведения "(Score *)", вы можете просто выполнить "Score * s1 = obj1;" потому что id с радостью приведёт к чему угодно без предупреждения от компилятора: -)
      2011-12-02 20: 28: 46Z
    2. справа orange80 downcasting не требует приведения перед слабой переменной.
      2012-05-03 10: 48: 58Z
    3. Спасибо, ребята, я удалил приведение из ответа
      2012-05-06 10: 20: 10Z
    4. Вы должны последовательно сортировать ноль против не-ноль по верху или низу, поэтому возвращаемое значение по умолчанию может быть return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
      2012-08-08 18: 53: 47Z
    5. хех Крис, я попробовал этот код, я обновил программу в моей программе .. впервые я исправляю работу, получил вывод в порядке убывания .. но когда я обновляю. (выполняю тот же код с теми же данными), это изменило порядок, яt не нисходящий. Скажи, что у меня 4 объекта в моем массиве, 3 человека с одинаковыми данными, 1 отличается.
      2012-09-13 07: 12: 50Z

    Начиная с iOS 4, вы также можете использовать блоки для сортировки.

    Для этого конкретного примера я предполагаю, что у объектов в вашем массиве есть метод 'position', который возвращает NSInteger.

    NSArray *arrayToSort = where ever you get the array from... ;
    NSComparisonResult (^sortBlock)(id, id) = ^(id obj1, id obj2) 
    {
        if ([obj1 position] > [obj2 position]) 
        { 
            return (NSComparisonResult)NSOrderedDescending;
        }
        if ([obj1 position] < [obj2 position]) 
        {
            return (NSComparisonResult)NSOrderedAscending;
        }
        return (NSComparisonResult)NSOrderedSame;
    };
    NSArray *sorted = [arrayToSort sortedArrayUsingComparator:sortBlock];
    

    Примечание: "отсортированный" массив будет автоматически освобожден.

        
    28
    2016-06-13 09: 52: 16Z

    Я перепробовал все, но у меня это сработало. В классе у меня есть другой класс с именем "crimeScene", и я хочу отсортировать по свойству "crimeScene".

    Это работает как шарм:

    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"crimeScene.distance" ascending:YES];
    [self.arrAnnotations sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
    
        
    25
    2016-12-24 07: 40: 28Z
    19
    2017-05-23 12: 34: 39Z
    1. Вызов метода на самом деле "sortedArrayUsingDescriptors:", с 's' в конце.
      2009-05-13 19: 58: 37Z
    2. Спасибо, еще не видел, что 's.
      2009-06-15 16: 20: 17Z
    NSSortDescriptor *sortDescriptor;
    sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate" ascending:YES] autorelease];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSArray *sortedArray;
    sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];
    

    Спасибо, все работает нормально ...

        
    18
    2016-01-31 18: 00: 00Z

    Ваши объекты Person должны реализовывать метод, например compare:, который принимает другой объект Person и возвращает NSComparisonResult в соответствии с отношениями между двумя объектами.

    Тогда вы бы позвонили sortedArrayUsingSelector: с @selector(compare:), и это должно быть сделано.

    Есть и другие способы, но, насколько я знаю, не существует Cocoa-эквивалент интерфейса Comparable. Использование sortedArrayUsingSelector:, вероятно, самый безболезненный способ сделать это.

        
    16
    2009-04-30 06: 25: 14Z

    Блоки iOS 4 спасут вас:)

    featuresArray = [[unsortedFeaturesArray sortedArrayUsingComparator: ^(id a, id b)  
    {
        DMSeatFeature *first = ( DMSeatFeature* ) a;
        DMSeatFeature *second = ( DMSeatFeature* ) b;
    
        if ( first.quality == second.quality )
            return NSOrderedSame;
        else
        {
            if ( eSeatQualityGreen  == m_seatQuality || eSeatQualityYellowGreen == m_seatQuality || eSeatQualityDefault  == m_seatQuality )
            {
                if ( first.quality < second.quality )
                    return NSOrderedAscending;
                else
                    return NSOrderedDescending;
            }
            else // eSeatQualityRed || eSeatQualityYellow
            {
                if ( first.quality > second.quality )
                    return NSOrderedAscending;
                else
                    return NSOrderedDescending;
            } 
        }
    }] retain];
    

    http://sokol8.blogspot.com/2011 /04/sorting-nsarray-with-blocks.html немного описания

        
    8
    2016-08-08 12: 21: 10Z

    Для NSMutableArray используйте метод sortUsingSelector. Он сортирует это место, не создавая новый экземпляр.

        
    7
    2013-06-03 07: 23: 14Z
    1. Просто обновление: я тоже искал что-то, что сортировало изменяемый массив на месте, теперь есть эквивалентные методы "sortUsing" для всех методов "sortedArrayUsing" с iOS 7. Например sortUsingComparator:.
      2013-11-17 19: 01: 18Z

    Вы можете использовать следующий общий метод для своих целей. Это должно решить вашу проблему.

    //Called method
    -(NSMutableArray*)sortArrayList:(NSMutableArray*)arrDeviceList filterKeyName:(NSString*)sortKeyName ascending:(BOOL)isAscending{
        NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:sortKeyName ascending:isAscending];
        [arrDeviceList sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
        return arrDeviceList;
    }
    
    //Calling method
    [self sortArrayList:arrSomeList filterKeyName:@"anything like date,name etc" ascending:YES];
    
        
    6
    2015-09-29 20: 56: 35Z

    Если вы просто сортируете массив из NSNumbers, вы можете отсортировать их одним вызовом:

    [arrayToSort sortUsingSelector: @selector(compare:)];
    

    Это работает, потому что объекты в массиве (NSNumber объекты) реализуют метод сравнения. Вы можете сделать то же самое для объектов NSString или даже для массива пользовательских объектов данных, которые реализуют метод сравнения.

    Вот пример кода с использованием блоков компаратора. Он сортирует массив словарей, где каждый словарь включает число в ключе «sort_key».

    #define SORT_KEY @\"sort_key\"
    
    [anArray sortUsingComparator: 
     ^(id obj1, id obj2) 
      {
      NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue];
      NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue];
      if (value1 > value2) 
    {
      return (NSComparisonResult)NSOrderedDescending;
      }
    
      if (value1 < value2) 
    {
      return (NSComparisonResult)NSOrderedAscending;
      }
        return (NSComparisonResult)NSOrderedSame;
     }];
    

    Приведенный выше код выполняет работу по получению целочисленного значения для каждого ключа сортировки и сравнивает их в качестве иллюстрации того, как это сделать. Поскольку объекты NSNumber реализуют метод сравнения, его можно переписать гораздо проще:

     #define SORT_KEY @\"sort_key\"
    
    [anArray sortUsingComparator: 
    ^(id obj1, id obj2) 
     {
      NSNumber* key1 = [obj1 objectForKey: SORT_KEY];
      NSNumber* key2 = [obj2 objectForKey: SORT_KEY];
      return [key1 compare: key2];
     }];
    

    или тело компаратора можно даже перевести на 1 строку:

      return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];
    

    Я предпочитаю простые операторы и множество временных переменных, потому что код легче читать и легче отлаживать. В любом случае компилятор оптимизирует временные переменные, поэтому нет преимущества перед версией «все в одной строке».

        
    5
    2013-06-03 07: 22: 57Z

    Я создал небольшую библиотеку методов категорий, названную Linq to ObjectiveC , которая делает этот вид вещь проще Используя метод сортировки с ключевым селектором, вы можете отсортировать по birthDate следующим образом:

    NSArray* sortedByBirthDate = [input sort:^id(id person) {
        return [person birthDate];
    }]
    
        
    4
    2013-03-06 08: 29: 13Z
    1. Вы должны назвать его " LINQ to Objective-C ".
      2017-11-28 13: 59: 19Z

    Я только что сделал многоуровневую сортировку на основе пользовательских требований.

    //сортируем значения

        [arrItem sortUsingComparator:^NSComparisonResult (id a, id b){
    
        ItemDetail * itemA = (ItemDetail*)a;
        ItemDetail* itemB =(ItemDetail*)b;
    
        //item price are same
        if (itemA.m_price.m_selling== itemB.m_price.m_selling) {
    
            NSComparisonResult result=  [itemA.m_itemName compare:itemB.m_itemName];
    
            //if item names are same, then monogramminginfo has to come before the non monograme item
            if (result==NSOrderedSame) {
    
                if (itemA.m_monogrammingInfo) {
                    return NSOrderedAscending;
                }else{
                    return NSOrderedDescending;
                }
            }
            return result;
        }
    
        //asscending order
        return itemA.m_price.m_selling > itemB.m_price.m_selling;
    }];
    

    https://sites.google.com/site/greateindiaclub/Mobil-приложения /ИОС /multilevelsortinginiosobjectivec р>     

    4
    2014-12-13 03: 06: 46Z

    Я использовал sortUsingFunction :: в некоторых своих проектах:

    int SortPlays(id a, id b, void* context)
    {
        Play* p1 = a;
        Play* p2 = b;
        if (p1.score<p2.score) 
            return NSOrderedDescending;
        else if (p1.score>p2.score) 
            return NSOrderedAscending;
        return NSOrderedSame;
    }
    
    ...
    [validPlays sortUsingFunction:SortPlays context:nil];
    
        
    4
    2016-01-31 18: 00: 53Z
    -(NSMutableArray*) sortArray:(NSMutableArray *)toBeSorted 
    {
      NSArray *sortedArray;
      sortedArray = [toBeSorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) 
      {
        return [a compare:b];
     }];
     return [sortedArray mutableCopy];
    }
    
        
    3
    2013-01-11 11: 32: 29Z
    1. зачем передавать изменяемый массив, когда возвращается новый массив. зачем вообще создавать обертку?
      2013-01-10 15: 40: 36Z

    Вы используете NSSortDescriptor для сортировки NSMutableArray с пользовательскими объектами

     NSSortDescriptor *sortingDescriptor;
     sortingDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                           ascending:YES];
     NSArray *sortArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];
    
        
    3
    2018-06-14 09: 21: 27Z

    Сортировка NSMutableArray очень проста:

    NSMutableArray *arrayToFilter =
         [[NSMutableArray arrayWithObjects:@"Photoshop",
                                           @"Flex",
                                           @"AIR",
                                           @"Flash",
                                           @"Acrobat", nil] autorelease];
    
    NSMutableArray *productsToRemove = [[NSMutableArray array] autorelease];
    
    for (NSString *products in arrayToFilter) {
        if (fliterText &&
            [products rangeOfString:fliterText
                            options:NSLiteralSearch|NSCaseInsensitiveSearch].length == 0)
    
            [productsToRemove addObject:products];
    }
    [arrayToFilter removeObjectsInArray:productsToRemove];
    
        
    2
    2016-01-31 18: 02: 06Z

    Сортировка с использованием NSComparator

    Если мы хотим отсортировать пользовательские объекты, нам нужно предоставить NSComparator, который используется для сравнения пользовательских объектов. Блок возвращает значение NSComparisonResult для обозначения порядка двух объектов. Таким образом, для сортировки всего массива NSComparator используется следующим образом.

    NSArray *sortedArray = [employeesArray sortedArrayUsingComparator:^NSComparisonResult(Employee *e1, Employee *e2){
        return [e1.firstname compare:e2.firstname];    
    }];
    

    Сортировка с использованием NSSortDescriptor
    Предположим, в качестве примера, что у нас есть массив, содержащий экземпляры пользовательского класса, у Employee есть атрибуты имя, фамилия и возраст. В следующем примере показано, как создать NSSortDescriptor, который можно использовать для сортировки содержимого массива в возрастающем порядке по ключу возраста.

    NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
    NSArray *sortDescriptors = @[ageDescriptor];
    NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];
    

    Сортировка с использованием пользовательских сравнений
    Имена являются строками, и когда вы сортируете строки для представления пользователю, вы всегда должны использовать локализованное сравнение. Часто вы также хотите выполнить сравнение без учета регистра. Вот пример с (localizedStandardCompare :), чтобы упорядочить массив по фамилии и имени.

    NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc]
                  initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)];
    NSSortDescriptor * firstNameDescriptor = [[NSSortDescriptor alloc]
                  initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)];
    NSArray *sortDescriptors = @[lastNameDescriptor, firstNameDescriptor];
    NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];
    

    Для справки и подробного обсуждения, пожалуйста, обращайтесь: https://developer.apple.com/library /ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
    http://www.ios-blog.co.uk/tutorials/objective-c/how-to-sort-nsarray-with-custom -Объекты / р>     

    1
    2016-06-17 05: 12: 49Z

    Протоколы и функциональное программирование Swift делают это очень простым: нужно просто привести свой класс в соответствие с протоколом Comparable, реализовать методы, требуемые протоколом, а затем использовать функцию высокого порядка sorted (by:) для создания отсортированного массива без кстати, нужно использовать изменяемые массивы.

    class Person: Comparable {
        var birthDate: NSDate?
        let name: String
    
        init(name: String) {
            self.name = name
        }
    
        static func ==(lhs: Person, rhs: Person) -> Bool {
            return lhs.birthDate === rhs.birthDate || lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedSame
        }
    
        static func <(lhs: Person, rhs: Person) -> Bool {
            return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedAscending
        }
    
        static func >(lhs: Person, rhs: Person) -> Bool {
            return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedDescending
        }
    
    }
    
    let p1 = Person(name: "Sasha")
    p1.birthDate = NSDate() 
    
    let p2 = Person(name: "James")
    p2.birthDate = NSDate()//he is older by miliseconds
    
    if p1 == p2 {
        print("they are the same") //they are not
    }
    
    let persons = [p1, p2]
    
    //sort the array based on who is older
    let sortedPersons = persons.sorted(by: {$0 > $1})
    
    //print sasha which is p1
    print(persons.first?.name)
    //print James which is the "older"
    print(sortedPersons.first?.name)
    
        
    1
    2017-03-27 22: 14: 35Z

    В моем случае я использую sortedArrayUsingComparator для сортировки массива. Посмотрите на приведенный ниже код.

    contactArray = [[NSArray arrayWithArray:[contactSet allObjects]] sortedArrayUsingComparator:^NSComparisonResult(ContactListData *obj1, ContactListData *obj2) {
        NSString *obj1Str = [NSString stringWithFormat:@"%@ %@",obj1.contactName,obj1.contactSurname];
        NSString *obj2Str = [NSString stringWithFormat:@"%@ %@",obj2.contactName,obj2.contactSurname];
        return [obj1Str compare:obj2Str];
    }];
    

    Также мой объект,

    @interface ContactListData : JsonData
    @property(nonatomic,strong) NSString * contactName;
    @property(nonatomic,strong) NSString * contactSurname;
    @property(nonatomic,strong) NSString * contactPhoneNumber;
    @property(nonatomic) BOOL isSelected;
    @end
    
        
    0
    2017-11-28 14: 00: 21Z

    Сортировать массив в Swift

    Для Swifty Человек ниже - это очень чистый метод для достижения поставленной цели в глобальном масштабе. Давайте рассмотрим пример пользовательского класса User, который имеет некоторые атрибуты.

    class User: NSObject {
        var id: String?
        var name: String?
        var email: String?
        var createdDate: Date?
    }
    

    Теперь у нас есть массив, который нам нужно отсортировать на основе createdDate либо по возрастанию, либо по убыванию. Итак, давайте добавим функцию для сравнения дат.

    class User: NSObject {
        var id: String?
        var name: String?
        var email: String?
        var createdDate: Date?
        func checkForOrder(_ otherUser: User, _ order: ComparisonResult) -> Bool {
            if let myCreatedDate = self.createdDate, let othersCreatedDate = otherUser.createdDate {
                //This line will compare both date with the order that has been passed.
                return myCreatedDate.compare(othersCreatedDate) == order
            }
            return false
        }
    }
    

    Теперь у нас есть extension из Array для User. Простыми словами, давайте добавим некоторые методы только для тех массивов, в которых есть только объекты User.

    extension Array where Element: User {
        //This method only takes an order type. i.e ComparisonResult.orderedAscending
        func sortUserByDate(_ order: ComparisonResult) -> [User] {
            let sortedArray = self.sorted { (user1, user2) -> Bool in
                return user1.checkForOrder(user2, order)
            }
            return sortedArray
        }
    }
    

    Использование в порядке возрастания

    let sortedArray = someArray.sortUserByDate(.orderedAscending)
    

    Использование для нисходящего заказа

    let sortedArray = someArray.sortUserByDate(.orderedAscending)
    

    Использование для того же заказа

    let sortedArray = someArray.sortUserByDate(.orderedSame)
    
      

    Вышеуказанный метод в extension будет доступен, только если тип Array   [User] || Array<User> р>

        
    0
    2018-03-24 21: 20: 34Z

    Вы должны создать sortDescriptor, а затем вы можете отсортировать массив nsmutablearray, используя sortDescriptor, как показано ниже.

     let sortDescriptor = NSSortDescriptor(key: "birthDate", ascending: true, selector: #selector(NSString.compare(_:)))
     let array = NSMutableArray(array: self.aryExist.sortedArray(using: [sortDescriptor]))
     print(array)
    
        
    0
    2018-04-12 10: 32: 49Z

    Используйте как это для вложенных объектов,

    NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastRoute.to.lastname" ascending:YES selector:@selector(caseInsensitiveCompare:)];
    NSMutableArray *sortedPackages = [[NSMutableArray alloc]initWithArray:[packages sortedArrayUsingDescriptors:@[sortDescriptor]]];
    

    lastRoute - это один объект, и этот объект содержит объект to, а объекту - строковые значения lastname.

        
    0
    2019-04-24 13: 19: 50Z
    NSSortDescriptor  *sort = [[NSSortDescriptor alloc] initWithKey:@"_strPrice"
                                                     ascending:sortFlag selector:@selector(localizedStandardCompare:)] ;
    
        
    - 1
    2015-01-05 07: 00: 45Z
    NSMutableArray *stockHoldingCompanies = [NSMutableArray arrayWithObjects:fortune1stock,fortune2stock,fortune3stock,fortune4stock,fortune5stock,fortune6stock , nil];
    
    NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"companyName" ascending:NO];
    
    [stockHoldingCompanies sortUsingDescriptors:[NSArray arrayWithObject:sortOrder]];
    
    NSEnumerator *enumerator = [stockHoldingCompanies objectEnumerator];
    
    ForeignStockHolding *stockHoldingCompany;
    
    NSLog(@"Fortune 6 companies sorted by Company Name");
    
        while (stockHoldingCompany = [enumerator nextObject]) {
            NSLog(@"===============================");
            NSLog(@"CompanyName:%@",stockHoldingCompany.companyName);
            NSLog(@"Purchase Share Price:%.2f",stockHoldingCompany.purchaseSharePrice);
            NSLog(@"Current Share Price: %.2f",stockHoldingCompany.currentSharePrice);
            NSLog(@"Number of Shares: %i",stockHoldingCompany.numberOfShares);
            NSLog(@"Cost in Dollars: %.2f",[stockHoldingCompany costInDollars]);
            NSLog(@"Value in Dollars : %.2f",[stockHoldingCompany valueInDollars]);
        }
        NSLog(@"===============================");
    
        
    - 3
    2014-04-07 23: 26: 05Z
источник размещен Вот