NSCountedSetクラス
解説
継承 | NSMutableSet : NSSet : NSObject |
準拠 | NSCoding (NSSet) |
NSCopying (NSSet) | |
NSMutableCopying (NSSet) | |
NSFastEnumeration (NSSet) | |
NSObject (NSObject) | |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能 | Mac OS X v10.0以降、iOS 2.0以降 |
定義 | NSSet.h |
概要
変更可能な重複しない整数値のコレクションクラスです。親クラスであるNSMutableSetと違う点は要素の追加時に同じ物がすでにあった場合にカウント値が一つあがるようになっているということです。そのため同じオブジェクトが追加されるとカウント値が一つあがり、除去されるとカウント値が一つ下がるようになっています。除去メッセージが送信されてもすぐに除去されず、カウント値が0になると除去されます。
要素を除去した時のカウント値の変化
#pragma mark NSCountedSet minusSet: -(void)method007 { NSArray *aArray = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d", nil]; NSCountedSet *aSet = [[NSCountedSet alloc] initWithCapacity:10]; [aSet addObjectsFromArray:aArray]; NSLog(@"%s a %@",__FUNCTION__,[aSet description]); //=>a {(c,d,a,b)} NSArray *bArray = [NSArray arrayWithObjects:@"d",@"e",@"f", nil]; NSCountedSet *bSet = [NSCountedSet setWithCapacity:10]; [bSet addObjectsFromArray:bArray]; NSLog(@"%s b %@",__FUNCTION__,[bSet description]); //=>b {(d,e,f)} [aSet unionSet:bSet]; [aSet enumerateObjectsUsingBlock:^(id obj,BOOL *stop) { NSLog(@"%s %p %@ %d",__FUNCTION__,obj,obj,[aSet countForObject:obj]); }]; //=> d 2 //=> b 1 //... NSArray *cArray = [NSArray arrayWithObjects:@"d", nil]; NSCountedSet *cSet = [NSCountedSet setWithCapacity:10]; [cSet addObjectsFromArray:cArray]; [aSet minusSet:cSet]; [aSet enumerateObjectsUsingBlock:^(id obj,BOOL *stop) { NSLog(@"%s %p %@ %d",__FUNCTION__,obj,obj,[aSet countForObject:obj]); }]; //=> d 1 //=> b 1 //... }
NSCountedSetはCFBagとトールフリーブリッジではありませんが似た仕組みになっています。
作成・初期化
親クラス(NSMutableSet)のメソッド(+setWithCapacity: )などで作成することもできますしallocで作成した後配列から初期化するメソッド
(– initWithArray: )、セットから初期化するメソッド(– initWithSet: )、初期値から作成するメソッド(– initWithCapacity: )があります。
要素の追加と除去
要素を追加・除去する方法としては、親クラスNSMutableSetの(– unionSet: )(– minusSet: )(– intersectSet: )などのメソッドが使えます。オブジェクト一つを追加・除去する方法としてこのクラスに(– addObject: )(– removeObject: )メソッドがあります。
要素数のカウント
要素のカウント数を取得するには(– countForObject: )メソッドを使用します。列挙をするためにNSEnumeratorを返すメソッド(– objectEnumerator)もありますがNSSetに(enumerateObjectsUsingBlock: )メソッドが追加されたため、使う機会は少ないでしょう。