Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

NSIndexSetクラス

INDEX>Foundation>

apple(mac)
apple(iOS)

解説

整数の集合クラス
重複は許されません。
連続している場合は、範囲として扱われます。
3,5,7,9,10,11なら(3 5 7 9-11)

継承 NSObject
準拠 NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 Mac OS X v10.3以降
iOS 2.0以降
定義 NSIndexSet.h

概要

重複しない整数値のコレクションクラスです。常にソートされた状態にあります。このクラスは作成・初期化後に変更する事はできません。変更可能なインデックスセットはNSMutableIndexSetを使用します。
このクラスをサブクラス化してはいけません。
NSArrayのobjectsAtIndexes:メソッドなどで使用します。
このクラスはNSSetと名前が似ていますがNSSetのサブクラスではありません。

作成

指定した番号でインデックスセットを作成するには(+ indexSetWithIndex)メソッドを使用します。指定した範囲の番号でインデックスセットを作成するには(+ indexSetWithIndexesInRange)メソッドを使用します。このクラスのサブクラスである変更可能なインデックスセットの作成のために(+ indexSet)メソッドも用意されています。空のインデックスセットを返します。
allocで作成した後、初期化するメソッド(– init)も用意されています。指定した番号で初期化するメソッド(– initWithIndex)、指定した範囲で初期化するメソッド(– initWithIndexesInRange)、別のインデックスセットから初期化するメソッド(– initWithIndexSet)などがあります。

指定の範囲からインデックスセットを作成する

#pragma mark indexSetWithIndexesInRange:
-(void)method001
{
    
    NSArray *anArray = [NSArray arrayWithObjects:@"aaa",[NSNumber numberWithFloat:2.0],@"bbb",@"ccc",@"ddd",@"eee",@"fff",@"ggg",@"hhh",nil];
    NSRange range = NSMakeRange(3,4);
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:range];

    
    NSArray *retArray = [anArray objectsAtIndexes:indexSet];
    
    NSLog(@"001 = %s : %@", __FUNCTION__,[retArray description]);
    //=>001 = -[OOOAppDelegate method001] :  (ccc,ddd,eee,fff)

}

インデックスセットの検証

インデックスセットに含まれる要素の数を取得したい場合は(– count)メソッドを使用します。

指定した番号がインデックスセットに含まれるかどうかは(– containsIndex)メソッドを使って調べます。指定したインデックスセットがレシーバのインデックスセットに含まれるかどうかは(– containsIndexes)メソッドを使います。全ての要素が含まれているとYESが返されます。

指定した範囲がインデックスセットに含まれるかどうかは(– containsIndexesInRange)メソッドを使って調べます。指定した範囲の全てがレシーバーのインデックスセットに含まれればYESが返されます。指定した範囲の一部がレシーバのインデックスセットの含まれるかどうかは(– intersectsIndexesInRange)メソッドを使います。一部でも含まれるならYESを返します。
指定したインデックスセットがレシーバに含まれる数が知りたい場合は(– countOfIndexesInRange)メソッドを使用します。

要素をテストして最初に条件にあったインデックスを返すメソッド(– indexPassingTest)があります。条件にあった範囲をインデックスセットにして返すメソッド(– indexesPassingTest)もあります。
それぞれオプション付きのメソッド(– indexWithOptions:passingTest)(– indexesWithOptions:passingTest)とオプションと範囲指定ができるメソッド(– indexInRange:options:passingTest)(– indexesInRange:options:passingTest)があります。オプションにNSEnumerationConcurrentをセットする事で並列処理になります。

条件にあった範囲のインデックスセットを返すサンプル

#pragma mark NSIndexSet indexesPassingTest
-(void)method014
{
    NSMutableIndexSet *aSet = [NSMutableIndexSet indexSet];
    
    [aSet addIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(10,10)]];
    [aSet addIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(30,10)]];
    [aSet addIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(50,10)]];
    [aSet addIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(70,10)]];
   
    NSIndexSet *passSet = [aSet indexesPassingTest:^ BOOL (NSUInteger idx, BOOL *stop){
        if (idx > 55) {
            return YES;
        }else{
            return NO;
        }
    }];
    
    [passSet enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) {
        NSLog(@"%s %d,%d",__FUNCTION__, range.location,range.length);
    }];
    //=> 56,4
    //=> 70,10
}

インデックスオブジェクトの列挙

インデックスセットオブジェクトの各要素を順に処理していくために(– enumerateRangesUsingBlock)メソッドを使う事ができます。オプション付き(– enumerateRangesWithOptions:usingBlock)とオプションと範囲指定ができるメソッド(– enumerateRangesInRange:options:usingBlock)もあります。
上記は範囲で処理して行きますが、一つずつ処理するためのメソッド(– enumerateIndexesUsingBlock)も用意されています。オプション付き(– enumerateIndexesWithOptions:usingBlock)とオプションと範囲指定ができるメソッド(– enumerateIndexesInRange:options:usingBlock)もあります。

インデックスセットの比較

インデックスセットの比較には(– isEqualToIndexSet)メソッドを使用します。要素が全て同じであればYESを返します。

インデックスを取得する

レシーバに含まれる最初のインデックスを得るには(– firstIndex)メソッドを使用します。レシーバに含まれる最後のインデックスは(– lastIndex)メソッドで得られます。
指定した番号よりも小さくてかつ最大のインデックスは(– indexLessThanIndex)メソッドを使います。指定した番号以下でかつ最大のインデックスを得るのは(– indexLessThanOrEqualToIndex)メソッドを使います。指定した番号より大きくかつ最小のインデックスを得るのは(– indexGreaterThanIndex)メソッドを使います。指定した番号以上でかつ最小のインデックスを得るのは(– indexGreaterThanOrEqualToIndex)メソッドを使います。

適合するプロトコル

サブクラス化の注意

引数

参照

メソッド