使用 NSIndexPath 访问嵌套元素
Posted
技术标签:
【中文标题】使用 NSIndexPath 访问嵌套元素【英文标题】:Access a nested element using NSIndexPath 【发布时间】:2014-04-04 17:42:07 【问题描述】:ios SDK 中真的没有 API 可以使用 NSIndexPath
遍历/访问嵌套数组结构吗?我查看了NSIndexPath
和NSArray
的文档?
例如:
NSArray *nested = @[
@[
@[@1, @2], @[@10, @20]
],
@[
@[@11, @22], @[@110, @220]
],
@[
@[@111, @222], @[@1110, @2220]
]
];
如果我想对@222 的访问路径建模,我可以组装:
NSIndexPath *path = [[[NSIndexPatch indexPathWithIndex: 2] indexPathByAddingIndex: 0] indexPathByAddingIndex: 1];
所以我必须编写自己的递归访问器吗?
id probe = nested;
for (NSInteger position = 0; position < path.length; position++)
probe = probe[path indexAtPosition: position];
令我惊讶的是,Apple 走了这么远来实际对构造进行建模,但却没有提供 API 将两者连接在一起。我希望在 NSArray
或 NSIndexPath
上使用一种方法,它允许执行以下操作:
id value = [nested objectAtIndexPath: path];
或者也许我错过了一个更惯用的转折?
更新:
我选择听从@CrimsonChris 的建议并整理了以下内容:
NSArray+NestedAccess.h
#import <Foundation/Foundation.h>
@interface NSObject (NestedAccess)
- (id) objectAtPath: (NSIndexPath*) path;
@end
NSArray+NestedAccess.c
#import "NSArray+NestedAccess.h"
@implementation NSArray (NestedAccess)
- (id) objectAtPath: (NSIndexPath*) path
id probe = self;
for (NSInteger position = 0; position < path.length; position++)
probe = ((NSArray*)probe)[path indexAtPosition: position];
return probe;
@end
【问题讨论】:
我真的不确定你在问什么。寻找getIndexes:
? indexPathWithIndexes:length:
? indexAtPosition
?
如果你不害怕 swizelling,你可以做得更多:kickingbear.com/blog/archives/9
【参考方案1】:
听起来你想要一个 NSIndexPath 的类别! NSIndexPath 并非旨在与 NSArrays“一起工作”。它足够通用,可以用于多种数据结构。
【讨论】:
希望有一个这样做的例子。我还没有经历过创作我自己的类别/扩展。如果有,我会给这个答案。 Apple 为NSIndexPath
提供类别,用于 UITableViews 和 UICollectionViews。这就是row
、section
和item
的来源。【参考方案2】:
只使用索引:
NSLog (@"nested 222: %@", nested[2][0][1]);
NSLog 输出:
嵌套 222:222
但也许我不明白你的意思:
如果我想对@222 的访问路径建模,我可以组装:
如果您想使用NSIndexPath
,为什么不创建一个执行数组索引的子类。或者创建一个辅助类或方法。
【讨论】:
以上是关于使用 NSIndexPath 访问嵌套元素的主要内容,如果未能解决你的问题,请参考以下文章