2012-04-13 2 views
3

Я сейчас пытаюсь научить себя Objective-C и играл с упражнением, где мне нужно было отсортировать массив.Сортировка массивов в Objective-C

мне удалось завершить его, используя следующий код:

NSSortDescriptor * newSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:TRUE]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:newSortDescriptor]; 
[self.theBookStore sortUsingDescriptors:sortDescriptors]; 

Мой вопрос о том, что на самом деле здесь происходит. Я не совсем понимаю, что я сделал.

Линия 1: Я понимаю, здесь я создал новый объект с дескриптором. У этого есть два параметра, столбец, который я хочу сортировать, и что он восходит.

Линия 2: Это линия, в которой я смущен. Зачем нужен массив дескрипторов сортировки? Когда я читаю этот код, я подозреваю, что он создает массив с одной строкой, это правильно?

Линия 3: Я понимаю, что это вызов метода sortUsingDescriptors, но опять же, моя путаница в том, почему эта функция ожидает массив.

Я прочитал документацию, но я действительно ищу простое объяснение.

Любая помощь очень ценится

+0

+1 за ваши усилия .. :-)) –

ответ

2
  • Линия 1: .. да ваше право. Вы создаете пользовательский объект под названием NSSortDescriptor. Этот объект определяет атрибут для сортировки после. Вы ввели «заголовок». Таким образом, объекты в вашем массиве для сортировки будут отсортированы после этого свойства (yourObject.title «kind-of»).

  • Линия 2: поскольку метод сортировки (sortUsingDescriptors) всегда нужен массив, вам необходимо создать NSArray только с одним объектом. Хорошо, ... выглядит глупо. Но имеет смысл. Допустим, вы хотели бы отсортировать после двух критериев (например, «title», затем «city»).

  • Строка 3: Да, она должна быть массивом из-за сортировки по более чем одному критерию.

И всегда держать память в чистоте: В строке 1 Вы же выделить/инициализации в NSSortDescriptor. Очистите его после использования (если вы не используете ARC). Так что добавьте строку:

[newSortDescriptor release]; 
+0

У нас было ARC для около года - возможно, пришло время начинать с того, что люди используют его, а не предполагают, что это не так. – Caleb

+0

Большое спасибо, действительно полезный ответ и имеет полный смысл. –

+0

@ Калеб: да, ваше право. Поддержка iOS 3.0 замедляет работу. :) –

1

Множественные сортировки дескрипторы будут использоваться для решения того, что произойдет, если есть несколько совпадений. Я приоритетный. Второй дескриптор подскажет, что делать, если он нашел два заголовка одинаковыми.

5

Линия 1: Я понимаю здесь, я создал новый объект с дескриптором . У этого есть два параметра, столбец, который я хочу сортировать, и , что он восходит.

Действительно, вы создали объект, который является дескриптор. Он описывает, как сортировать массив.

Линия 2: Это линия, о которой я смущен. Зачем нужен массив дескрипторов сортировки ?Когда я читаю этот код, я подозреваю, что он создает массив , и только одна строка верна?

Правильно - вы создали массив, содержащий один объект. Вы могли бы создать массив с десятью или пятнадцатью или восемьюдесятью семью дескрипторами сортировки, если вы действительно хотите сортировать по многим полям. Чаще всего вы используете один, два, может быть, три. Итак, если вы сортируете список людей, вы можете добавить дескрипторы сортировки, которые определяют фамилию и имя. Таким образом, люди, имеющие одну и ту же фамилию, будут расположены в пределах этой группы в соответствии с их именем.

Линия 3: Я понимаю, что это вызов sortUsingDescriptors метод, но опять же, моя путаница, почему эта функция ожидает массив.

Опять же, это означает, что вы можете иметь ключи сортировки первичных, вторичных, третичных (и т. Д.). У вас может быть отдельный метод, который принимает один дескриптор сортировки вместо массива для тех времен, когда вы хотите сортировать только один ключ. NSArray не дает, но вы всегда можете добавить его в категорию, если вы хотите:

@category NSArray (SingleSortDescriptor) 

- (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor; 

@end 

@implementation NSArray (SingleSortDescriptor) 

- (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor 
{ 
    return [self sortUsingDescriptors:[NSArray arrayWithObject:descriptor]]; 
} 

@end 
+1

Отличное объяснение! – user523234

+1

Я действительно большой поклонник ваших хорошо объясненных ответов .. –

+1

@anonymous Отличный комплимент - спасибо очень. – Caleb

Смежные вопросы