我正在阅读“核心数据”部分的“更多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语句背后的原因。提前谢谢。
答案 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)
他获取行和部分,然后他获得该部分指定的数组。然后他做了两次健全检查:
我实际上是一个阵列吗?
行号是否对此特定数组有效?
如果两者都为真,则他从row
指定的索引处的section数组中返回对象。