类别Objc,嵌套数组

时间:2011-02-21 17:53:12

标签: objective-c core-data categories

我正在阅读“核心数据”部分的“更多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 个答案:

答案 0 :(得分:2)

代码实际上并不创建新数组,作者只是持有对已存储在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 :(得分:1)

如果包含一些评论,也许会有所帮助:

// 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

答案 2 :(得分:0)

他没有创建新数组。他得到了代表该部分的“子”数组。

第一个if语句就在那里,因为你可以创建一个NSArray(让我们说)充满了NSStrings。如果subItem是NSString,objectAtIndex:会引发异常。

当您尝试访问不在subArray中的索引上的项目时,第二个保护您。如果你不会在这个位置返回零,那么也会有例外。

答案 3 :(得分:0)

首先,他没有创建新阵列。他只是为指定的indexPath获取对象并检查它是否为数组。如果它不是数组,或者指定的行大于数组的大小,则返回nil。

答案 4 :(得分:0)

他获取行和部分,然后他获得该部分指定的数组。然后他做了两次健全检查:

  1. 我实际上是一个阵列吗?

  2. 行号是否对此特定数组有效?

  3. 如果两者都为真,则他从row指定的索引处的section数组中返回对象。