2014-11-17 2 views
0

Я получаю следующий сбой при попытке получить первые 10 наборов ключей. Вот код, вызывающий проблему.iOS: «NSInvalidArgumentException», причина: '- [__ NSCFString sortedArrayUsingFunction: context:]: непризнанный селектор, отправленный экземпляру.

for (int i = 0; i < 10; i++) { 

     sortedArray = [ [answers allKeys][i] sortedArrayUsingFunction:sort context:nil]; 

     } 

Однако, когда я просто использовать этот sortedArray = [ [answers allKeys] sortedArrayUsingFunction:sort context:nil]; я не получаю аварии. Может кто-то, пожалуйста, помогите мне выяснить, как это исправить? Мне просто нужны первые 10 ключей.

+0

Кажется, что где-то '[ответы AllKeys] [я]' 'является NSString', а не' NSArray'. – Larme

+0

NSString не NSArray. –

+0

Как вы ожидаете, что это сработает? Даже если сам сорт работал, он не может вернуть более одной записи, поэтому указатель, хранящийся в 'sortedArray', будет содержать (не более) один элемент. И каждая итерация цикла заменяет предыдущее значение 'sortedArray' новым значением, что означает, что только последняя итерация имеет какой-либо эффект. –

ответ

2

Я просто угадываю здесь, но я думаю, что вы этого хотите.

NSArray *arr = [[answers allKeys] subarrayWithRange:NSMakeRange(0, 10)]; 
NSArray *sorted = [arr sortedArrayUsingFunction:sort context:nil]; 

К сожалению, это не сработает, и вам нужно будет изменить свою архитектуру. Вот почему.

Словари неупорядочены. Это означает, что allKeys может вернуться в любом порядке в любой момент. В частности, так, как вы это делаете, когда вы повторяете, это маловероятно, но вполне возможно, что у вас будет массив, заполненный всем одним и тем же ключом. Если вы используете приведенный выше код, вы получите отсортированный массив из 10 ключей. Хотя эти ключи будут уникальными, они не будут определяться никаким порядком и должны считаться случайными.

Возможно, вам нужно отсортировать ключи до фильтрации вашего массива? Это может выглядеть примерно так:

NSArray *sorted = [[answers allKeys] sortedArrayUsingFunction:sort context:nil]; 
NSArray *filtered = [sorted subarrayWithRange:NSMakeRange(0, 10)]; 
+2

Я считал, что, может быть, он хотел сортировать, а затем взять первую десятку; возможно, сортировка была там явно, потому что словари неупорядочены. Но нет, недостаточно информации в вопросе, чтобы быть уверенным. – Tommy

0

Вы получаете сбой, потому что [answers allkeys][i] возвращается в NSString.

Возможно, что вы пытаетесь сделать, может быть выполнено следующим образом:

NSArray* sortedArray = [[answers allKeys] sortedArrayUsingFunction:sort context:nil]; 
NSArray* sorted1st10 = [sortedArray subarrayWithRange:NSMakeRange(0, 10)]; 
Смежные вопросы

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