Получение максимальной даты из NSArray, KVC

У меня есть массив NSDate, и я хотел бы получить самый большой NSDate из массива. Хотя я всегда мог отсортировать их и взять первый/последний, есть ли способ сделать это с помощью KeyValueCoding или каким-либо другим быстрым способом с одним вкладышем? Я знаю, что мог бы использовать что-то вроде valueForKeyPath@"@max.date", если бы у объектов было свойство даты, но что, если объекты сами являются датами??

спасибо


person Sean Danzeiser    schedule 28.02.2013    source источник
comment
я думаю, я могу просто использовать этот [dateArray sortUsingSelector:@selector(compare:)];   -  person Sean Danzeiser    schedule 01.03.2013
comment
Если вам действительно нужен одноразовый подход с KVC, создайте подкласс NSMutableArray и напишите сами операторы.   -  person CodaFi    schedule 01.03.2013
comment
Вы были на правильном пути, за исключением одной вещи, которую вы упустили. Вместо @"@max.date" надо было попробовать @"@max.self". Я проверил это на себе, и это работает нормально для меня.   -  person iDev    schedule 01.03.2013


Ответы (2)


Ты можешь использовать,

NSDate *maxDate = [dateArray valueForKeyPath:@"@max.self"];

Это даст вам самую большую дату из массива. Вам не нужно сортировать массив перед этим.

Из документации,

Оператор @max сравнивает значения свойства, указанного путем ключа справа от оператора, и возвращает максимальное найденное значение. Максимальное значение определяется с помощью метода compare: объектов по указанному ключевому пути. Сравниваемые объекты свойств должны поддерживать сравнение друг с другом. Если значение правой части пути к ключу равно нулю, оно игнорируется.

Обратите внимание, что @max выполнит compare:, а затем узнает максимальное значение.

person iDev    schedule 01.03.2013
comment
именно то, что я искал. Не знал, что там можно использовать себя. Спасибо! - person Sean Danzeiser; 01.03.2013

Согласен с @SeanDanzeiser. Чтобы быть более конкретным, вот однострочный код размером ~ 70 байт:

// if dateArray is the array of dates ...
NSDate *maxDate = [[dateArray sortedArrayUsingSelector:@selector(compare:)] lastObject];
person danh    schedule 01.03.2013
comment
Это отлично работает, если вы хотите сравнить какое-то свойство, но вам нужен фактический элемент с самым высоким (или самым низким) значением, а не значением. Что еще лучше, так это использовать sortedArrayUsingComparator:, и вы можете предоставить свой собственный встроенный компаратор. Спасибо! - person mkko; 24.08.2013