Категории Obj-C, NestedArrays - PullRequest
       10

Категории Obj-C, NestedArrays

0 голосов
/ 21 февраля 2011

Я читаю пример в книге «Больше разработки для Iphone» в разделе «Основные данные», и автор создает категорию, чтобы превратить NSIndexPath в ключ строки и метку строки. Вот код:

@implementation NSArray(NestedArrays)
- (id)nestedObjectAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = [indexPath row];
NSUInteger section = [indexPath section];
NSArray *subArray = [self objectAtIndex:section];

if (![subArray isKindOfClass:[NSArray class]])
return nil;

if (row >= [subArray count])
return nil;

return [subArray objectAtIndex:row];
}

- (NSInteger)countOfNestedArray:(NSUInteger)section {
NSArray *subArray = [self objeectAtIndex:section];
return [subArray count];
}
@end

В первом методе, после того, как он получил строку и раздел для NSIndexPath, я не уверен, что происходит потом. Я не понимаю, почему он создает новый массив в разделе, а затем я не понимаю причину двух утверждений if, которые следуют. Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 21 февраля 2011

Код на самом деле не создает новый массив, автор просто держит ссылку на объект, который уже хранится в self. Аннотации для каждой строки приведены ниже.

Получить строку из indexPath:

NSUInteger row = [indexPath row];

Получить индекс раздела из indexPath:

NSUInteger section = [indexPath section];

Разыменовать массив в self по индексу section

NSArray *subArray = [self objectAtIndex:section];

Если вложенный массив не является массивом, произойдет сбой:

if (![subArray isKindOfClass:[NSArray class]])
   return nil;

Если строка в подмассиве больше, чем ее последний индекс, ошибка:

if (row >= [subArray count])
   return nil;

Возвращает объект в подмассиве в данной строке:

return [subArray objectAtIndex:row];
1 голос
/ 21 февраля 2011

Может быть, это поможет, если будут включены некоторые комментарии:

// Get the subarray corresponding to the requested section
NSArray *subArray = [self objectAtIndex:section];

// verify that it is really an NSArray
if (![subArray isKindOfClass:[NSArray class]])
    return nil;  // not an array - fail

// Check the array subscript (row #) against the size of the subarray
if (row >= [subArray count])
    return nil;  // out of bounds - fail

return [subArray objectAtIndex:row]; // return the requested element
0 голосов
/ 21 февраля 2011

Он получает строку и раздел, а затем он получает массив, указанный этим разделом.Затем он выполняет две проверки работоспособности:

  1. Есть ли у меня массив на самом деле?

  2. Допустим ли номер строки для этого конкретного массива?

Если оба они истинны, он возвращает объект из массива раздела по индексу, указанному row.

0 голосов
/ 21 февраля 2011

Во-первых, он не создает новый массив.Он просто берет объект для указанного indexPath и проверяет, является ли он массивом.Если это не массив или указанная строка больше размера массива, он возвращает nil.

0 голосов
/ 21 февраля 2011

Он не создает новый массив. Он получает "sub" массив, который представляет раздел.

Первый оператор if существует, потому что вы можете создать NSArray, который (скажем так) полон строк NSStrings. И если подэлементом будет NSString, objectAtIndex: вызовет исключение.

А второй защищает вас, когда вы пытаетесь получить доступ к элементу, который находится в индексе, который отсутствует в subArray. Если вы не вернете ноль в этой позиции, то будет и исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...