ТЛ; др: ключевые трактов вы ищете являются «длина» и «я» (или «описание» или «uppercaseString» в зависимости от того, как вы хотите сравнить)
как йо u можно увидеть в документации для NSSSortDescriptor, дескриптор сортировки создается «путем указания пути ключа к сравниваемому свойству». При сортировке строки их длиной свойство на NSString, что вы ищете length
:
@property(readonly) NSUInteger length;
Так как вы хотите, слова, чтобы быть длиннее и длиннее, что-то дескриптор должен быть восходящим, так что позже значения имеют на большую длину, чем предыдущее значение.
NSSortDescriptor *byLength =
[NSSortDescriptor sortDescriptorWithKey:@"length" ascending:YES];
Далее, чтобы отсортировать строку по алфавиту, то, что вы действительно хотите, это сравнить строку непосредственно с другой строкой. Есть несколько способов сделать это. Например, метод description
в NSString (который может быть вызван с использованием KVC) документирован для возврата «Этот объект NSString», что означает сам объект. Это будет один из вариантов.
NSSortDescriptor *alphabeticallyAlternative1 =
[NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
Другие методы, которые вы можете вызвать более KVC являются, например, uppercaseString
или lowercaseString
. Используя любой из них в дескрипторе сортировки, вы получите нечувствительное к регистру сравнение (которое либо полезно для вас, либо оно не является).
// case-insensitive comparison
NSSortDescriptor *alphabeticallyAlternative2 =
[NSSortDescriptor sortDescriptorWithKey:@"uppercaseString" ascending:YES];
Третий способ сравнения самой строки непосредственно с другой строкой, чтобы использовать ключ пути "self"
. Иногда вы увидите, что это используется в предикатах.
NSSortDescriptor *alphabeticallyAlternative3 =
[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
Во всех 3 случаях дескриптор рода был сделан восходящим, так что письма, которые появляются позже в алфавите позже в массиве.
Какой бы вариант алфавитной сортировки, которые вы выбираете, так как вы хотите, чтобы отсортировать по длине первой вы бы передать дескриптор byLength первого и алфавитный дескриптора второго.
NSArray *sorted =
[someStrings sortedArrayUsingDescriptors:@[byLength, alphabetically]];
Несомненно, вы должны были что-то совершить в этот час. Это помогло бы нам, если бы вы могли показать нам, как далеко вы добрались, и где вы застряли. –
Возможный дубликат [Как установить вторичный ключ сортировки NSSortDescriptor?] (Http://stackoverflow.com/questions/8410637/how-to-establish-secondary-nssortdescriptor-sort-key) – KevinDTimm
@ DavidRönnqvist Я застрял в понимании какие свойства (ключи) использовать с NSSortDescriptor для сортировки строк по алфавиту или по длине. Я видел ответ KevenDTrimm, но все примеры, которые я нашел, показывают только, как это сделать с произвольными объектами. Я не понял, как сортировать NSStrings, используя NSSortDescriptors, потому что я не знаю, какие свойства использовать. И теперь это просто забрасывается в забвение по какой-то реальной причине, так что это довольно обескураживающе. Не дай бог, опытные программисты iOS считают это тривиальным - автоматически глупый вопрос, DOWNVOTE. – Aerovistae