macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSMutableSetクラス

INDEX>Foundation>

apple(mac)
apple(iOS)

解説

継承 NSObject
準拠 NSCopying (NSSet)
NSMutableCopying (NSSet)
NSFastEnumeration (NSSet)
NSSecureCoding (NSSet)
NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 OS X 10.0以降
使用可能 iOS 2.0以降
定義 NSPredicate
NSSet.h

概要

要素の重複が無く順序もない、変更可能なコレクションクラスです。
このクラスのサブクラスであるNSCountedSetクラスでは同じ要素を複数含む事ができます。

C言語フレームワークである、Core FoundationのCFMutableSetRefとトールフリーブリッジです。ARC環境以外ではそのまま使用できます。
どちらかのフレームワークにしかないメソッド・関数を使いたい場合、キャストして使うことが出来ます。
ARC環境では、管理対象のオブジェクトのキャストに__bridge、__bridge_retained、__bridge_transferが必要になります。

作成

親クラスであるNSSetクラスのメソッド(+ set)で作成できます。仮の要素数を指定する(+ setWithCapacity: )メソッドで作成する事もできます。仮の要素数は必要に応じて拡張されます。allocで作成した後(– initWithCapacity: )で初期化して作成する事もできます。

NSMutableSet *aSet = [NSMutableSet setWithCapacity:10];

要素の追加と削除

NSMutableSetオブジェクトに要素を追加するには(– addObject)メソッドを使います。複数の要素を同時に追加するには(– addObjectsFromArray)メソッドを使います。すでに同じ要素が存在する場合は無視されます。


配列を使って要素を追加する

#pragma mark NSSet addObjectsFromArray:
-(void)method003
{
    NSString *a1String = @"a";
    NSString *bString = @"b";
    NSString *cString = @"c";
    NSString *a2String = [NSString stringWithFormat:@"%@",@"a"];
    NSString *a3String = @"a";
    NSArray *anArray = [NSArray arrayWithObjects:a1String,bString,cString,a2String,a1String,a3String, nil];
    
    NSMutableSet *aSet = [NSMutableSet setWithCapacity:10];
    [aSet addObjectsFromArray:anArray];
    
    NSLog(@"%@",[aSet description]);
    //=>{(c,a,b)}
    [aSet enumerateObjectsUsingBlock:^(id obj,BOOL *stop) {
        NSLog(@"%s %p %@",__FUNCTION__,obj,obj);
    }];
    //=>0x572c c
    //=>0x570c a
    //=>0x571c b
    
}

NSMutableSetオブジェクトから要素を削除するには(– removeObject)メソッドを使います。全ての要素を取り除くには(– removeAllObjects)メソッドを使います。
NSPredicateクラスを使ったフィルタリングで条件に合う要素だけを絞り込むメソッド(– filterUsingPredicate)も用意されています。

NSPredicateクラスを使ったフィルタリングの例

#pragma mark NSSet filterUsingPredicate:
-(void)method006
{
    
    NSArray *anArray = [NSArray arrayWithObjects:@"aaa",@"bbb", @"ccc", @"aaa",@"abc",@"これが",nil];
    NSMutableSet *aSet1 = [NSMutableSet setWithCapacity:10];
    NSMutableSet *aSet2 = [NSMutableSet setWithCapacity:10];
    NSMutableSet *aSet3 = [NSMutableSet setWithCapacity:10];
    NSMutableSet *aSet4 = [NSMutableSet setWithCapacity:10];
    NSMutableSet *aSet5 = [NSMutableSet setWithCapacity:10];
    [aSet1 addObjectsFromArray:anArray];
    [aSet2 addObjectsFromArray:anArray];
    [aSet3 addObjectsFromArray:anArray];
    [aSet4 addObjectsFromArray:anArray];
    [aSet5 addObjectsFromArray:anArray];
    
    NSPredicate *aPredicate1 = [NSPredicate predicateWithFormat:@"SELF IN %@",[NSArray arrayWithObjects:@"aaa", @"bbb", nil]];
    NSPredicate *aPredicate2 = [NSPredicate predicateWithFormat:@"SELF LIKE %@",@"aaa"];
    NSPredicate *aPredicate3 = [NSPredicate predicateWithFormat:@"SELF LIKE %@",@"s"];
	NSPredicate *aPredicate4 = [NSPredicate predicateWithFormat:@"SELF LIKE %@",@"a*"];
    
	NSPredicate *aPredicate5 = [NSPredicate predicateWithFormat:@"SELF LIKE %@",@"*が*"];
    [aSet1 filterUsingPredicate: aPredicate1 ];
    [aSet2 filterUsingPredicate: aPredicate2 ];
    [aSet3 filterUsingPredicate: aPredicate3 ];
    [aSet4 filterUsingPredicate: aPredicate4 ];
    [aSet5 filterUsingPredicate: aPredicate5 ];
    
    NSLog(@"%s 1 %@",__FUNCTION__,[aSet1 description]);
    //=>1 {(aaa,bbb)}
    NSLog(@"%s 2 %@",__FUNCTION__,[aSet2 description]);
    //=>2 {(aaa)}
    NSLog(@"%s 3 %@",__FUNCTION__,[aSet3 description]);
    //=>3 {()}
    NSLog(@"%s 4 %@",__FUNCTION__,[aSet4 description]);
    //=>4 {(aaa,abc)}
    NSLog(@"%s 5 %@",__FUNCTION__,[aSet5 description]);
    //=>5 {("\U3053\U308c\U304c")}
}

セットの統合と分離

レシーバに別のセットの要素を統合するには(– unionSet)メソッドを使います。レシーバの要素が{(c,d,a,b)}であるとき、別のセット{(d,e,f)}を統合するとレシーバは{(c,d,e,a,f,b)}になり、別のセットは{(d,e,f)}のままになります。

レシーバから別のセットの要素に含まれる要素を取り除くには(– minusSet)メソッドを使います。レシーバの要素が{(c,d,a,b)}であるとき、別のセット{(d,e,f)}を取り除くとレシーバは{(c,a,b)}になり、別のセットは{(d,e,f)}のままになります。

レシーバと別のセット間で共通する要素を抜き出すには(– intersectSet)メソッドを使います。レシーバの要素が{(c,d,a,b)}であるとき、別のセット{(d,e,f)}と共通な要素のみにしますのでレシーバは{(d)}になり、別のセットは{(d,e,f)}のままになります。

レシーバの要素を丸ごと別のセットで置き換えるには(– setSet:)メソッドを使います。冗談みたいなメソッド名ですが。レシーバの要素が{(c,d,a,b)}であるとき、別のセット{(d,e,f)}に全て置き換えるとレシーバは{(d,e,f)}になり、別のセットは{(d,e,f)}のままになります。

セットオブジェクトの統合

#pragma mark NSSet unionSet:
-(void)method007
{
    NSArray *aArray = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d", nil];
    NSMutableSet *aSet = [NSMutableSet setWithCapacity:10];
    [aSet addObjectsFromArray:aArray];
    NSLog(@"%s a %@",__FUNCTION__,[aSet description]);
    //=>a {(c,d,a,b)}
    
    NSArray *bArray = [NSArray arrayWithObjects:@"d",@"e",@"f", nil];
    NSMutableSet *bSet = [NSMutableSet setWithCapacity:10];
    [bSet addObjectsFromArray:bArray];
    NSLog(@"%s b %@",__FUNCTION__,[bSet description]);
    //=>b {(d,e,f)}
    
    [aSet unionSet:bSet];
    
    NSLog(@"%s a %@",__FUNCTION__,[aSet description]);
    //=>a {(c,d,e,a,f,b)}
    NSLog(@"%s b %@",__FUNCTION__,[bSet description]);
    //=>b {(d,e,f)}
    
}

適合するプロトコル

サブクラス化の注意