Начните с просмотра документации Apple по NSArray и NSDictionary . В этом случае, похоже, что массив (NSArray) содержит несколько NSDictionaries.
Данные сохраняются в обязательном порядке, а затем передаются в массив nsmuttablearray.
Во-первых, я должен отметить, что переменные в Objective-C являются просто указателями. Когда у вас есть такая строка:
NSMutableArray *rows;
Вы только говорите: «Я ожидаю, что эта переменная будет указывать на NSMutableArray». Это в значительной степени эквивалентно,
id rows;
… и вы не будете останавливаться во время выполнения от помещения обычного массива в переменную, которая была объявлена для изменяемых массивов (или от помещения строки в переменную, которая была объявлена для словаря!). Это будет работать! Но ваша программа аварийно завершит работу, когда вы попытаетесь сделать изменяемые объекты в неизменяемом массиве или словарь в строке.
Объявление его как указателя на NSMutableArray вместо id имеет несколько преимуществ:
- Это позволяет XCode помочь вам с помощью автозаполнения имен методов
- Это позволяет компилятору предупреждать вас, когда вы пытаетесь вызвать методы, которых нет у NSMutableArray
Итак, даже если ваша переменная объявлена как NSMutableArray *rows
, в этой строке:
rows = [[dict objectForKey:@"courses"] retain];
… если объект «курсы» не был изменяемым, то то, что у вас есть в rows
, тоже не является. Вместо этого вы можете сделать это:
rows = [[dict objectForKey:@"courses"] mutableCopy];
… чтобы получить собственную копию массива NSMutableArray (которую вы должны выпустить, как если бы вы сохранили оригинал).
Вы исследуете массив и словари со стандартным кодом Какао. Вот один из способов получить все курсы «понедельника»:
NSMutableArray *mondayCourses = [NSMutableArray array];
for (NSDictionary* course in rows){
if([[course objectForKey:@"Day"] isEqual:@"Monday"]){
[mondayCourses addObject:course];
}
}
(Внимание, я не запускал этот код.)