你没有错过任何东西。除了循环来执行此操作之外,没有任何真正方便的方法。当然,任何解决方案从根本上来说都是循环的,但是如果有一些内置的“过滤”或重新排列能力会很好NSArray
(/me 谨慎地咳嗽并查看 Python 列表理解)。
在 GitHub 上vikingosegundo 的 arraytools或其他类似的集合操作扩展中可能有一些有用的东西。编写自己的类别方法来执行此操作当然没有什么坏处,但是,就像我说的那样,那里必须有一个循环。
这是我的建议,不管它值多少钱。通过枚举来拆分数组:
NSMutableArray * keys = [NSMutableArray array];
NSMutableArray * values = [NSMutableArray array];
[array enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop)){
if( idx % 2 ){
[values addObject:obj];
else {
[keys addObject:obj];
}
}];
NSDictionary * d = [NSDictionary dictionaryWithObjects:values forKeys:keys];
似乎应该有更好的方法来做到这一点,例如使用NSIndexSet
and objectsAtIndexes:
,但是没有方便的方法来创建具有非连续索引的索引集。
像这样的东西,例如,会很好:
@implementation NSIndexSet (WSSNonContiguous)
+ (id) WSS_indexSetWithOddIndexesInRange: (NSRange)range
{
NSMutableIndexSet * s = [NSMutableIndexSet indexSet];
// If the start of the range is even, start with the next number.
NSUInteger start = range.location % 2 ? range.location : range.location + 1;
NSUInteger upper_limit = range.location + range.length;
for( NSUInteger i = start; i < upper_limit; i += 2 ){
[s addIndex:i];
}
return s;
}
+ (id) WSS_indexSetWithEvenIndexesInRange: (NSRange)range
{
NSMutableIndexSet * s = [NSMutableIndexSet indexSet];
// If the start of the range is odd, start with the next number.
NSUInteger start = range.location % 2 ? range.location + 1 : range.location;
NSUInteger upper_limit = range.location + range.length;
for( NSUInteger i = start; i < upper_limit; i += 2 ){
[s addIndex:i];
}
return s;
}
@end
使用辅助功能:
NSRange rangeOfNumbers(NSUInteger start, NSUInteger end)
{
return (NSRange){start, end-start};
}
这样你就可以做到这一点:
NSIndexSet * s = [NSIndexSet WSS_indexSetWithEvenIndexesInRange:rangeOfNumbers(0, 10)];
NSLog(@"%@", s);
// Prints: <NSMutableIndexSet: 0x7fccca4142a0>[number of indexes: 5 (in 5 ranges), indexes: (0 2 4 6 8)]