あなたは何も見逃していません。これを行うためにループする以外に本当に便利な方法はありません。もちろん、どのような解決策も根本的にはループしますが、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
となどを使用するなど、これを行うためのより良い方法があるはずですが、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)]