Ответ 1
Развернув бит в вопросе, существует несколько ситуаций, в которых может потребоваться последний объект массива, с разными способами его получения.
В прямой программе Cocoa
Если кто-то хочет получить объект в рамках стандартной программы Cocoa, то это сделает это:
[myArray lastObject]
Чтобы решить проблему счётчика - нет необходимости реализовывать один из них:
NSUInteger myCount = [myArray count];
Использование кодирования с ключом (KVC)
Если вам нужно получить доступ к последнему объекту массива через KVC, история требует немного объяснения.
Во-первых, запрос значения нормального ключа из массива создаст новый массив, состоящий из значений этого ключа для каждого из объектов в массиве. Другими словами, запрос на ключ lastObject
из массива заставит массив отправлять valueForKey:
каждому из объектов с помощью клавиши lastObject
на них. Помимо того, что он не является ожидаемым результатом, он также, вероятно, сделает исключение.
Итак, если вам действительно нужно отправить ключ самому массиву (в отличие от его содержимого), ключ должен быть добавлен с помощью @
-sign. Это сообщает массиву, что ключ предназначен для самого массива, а не его содержимого.
Следовательно, ключ должен иметь форму @lastObject
и использоваться следующим образом:
NSArray *arr = @[@1, @2, @3];
NSNumber *number = [arr valueForKey: @"@lastObject"];
В дескрипторе сортировки
Пример того, как этот ключ может использоваться в реальной программе, - это ситуация, когда массив массивов должен быть отсортирован последним объектом в каждом из внутренних массивов.
Вышеприведенный ключ просто используется в дескрипторе сортировки:
NSArray *arrayOfArrays = @[@[@5, @7, @8], @[@2, @3, @4, @6], @[@2, @5]];
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey: @"@lastObject" ascending: YES];
NSArray *sorted = [arrayOfArrays sortedArrayUsingDescriptors: @[sd]];
В предикате
Аналогично, для фильтрации массива массивов ключ может использоваться непосредственно в предикате:
NSPredicate *pred = [NSPredicate predicateWithFormat: @"[email protected] > 5"];
NSArray *filtered = [arrayOfArrays filteredArrayUsingPredicate: pred];
Люди, предпочитающие оставить self
-part, могут просто использовать формат @"@lastObject > 5"