使用 NSIndexPath 访问嵌套元素

Posted

技术标签:

【中文标题】使用 NSIndexPath 访问嵌套元素【英文标题】:Access a nested element using NSIndexPath 【发布时间】:2014-04-04 17:42:07 【问题描述】:

ios SDK 中真的没有 API 可以使用 NSIndexPath 遍历/访问嵌套数组结构吗?我查看了NSIndexPathNSArray 的文档?

例如:

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 将两者连接在一起。我希望在 NSArrayNSIndexPath 上使用一种方法,它允许执行以下操作:

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。这就是rowsectionitem 的来源。【参考方案2】:

只使用索引:

NSLog (@"nested 222: %@", nested[2][0][1]);

NSLog 输出:

嵌套 222:222

但也许我不明白你的意思:

如果我想对@222 的访问路径建模,我可以组装:

如果您想使用NSIndexPath,为什么不创建一个执行数组索引的子类。或者创建一个辅助类或方法。

【讨论】:

以上是关于使用 NSIndexPath 访问嵌套元素的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 NSIndexPath 部分值?

访问嵌套的外部函数元素

NSIndexPath 延伸

访问嵌套结构的元素

使用 Laravel 数组助手访问嵌套数组中的值

如何使用python修改xml文件中嵌套元素的文本?