Objective-C有3種集合類型(collection):array,dictionary,set,他們?nèi)叩亩x如下:
array:有序集合
dictionary:鍵-值集合
set:無序唯一集合
前2者大家用得比較多,只有set,很可能大家都沒用過
先看看以下代碼:
NSMutableSet* setA = [NSMutableSet new];
NSArray* arrayA = @[@1, @2];
[setA addObject:arrayA];
NSArray* arrayB =@[@1];
[setA addObject:arrayB];
NSLog(@"setA : %@", setA);
看看控制臺輸入,A和B都有
更改一下程序,將arrayB初始化與arrayA一樣
NSArray* arrayB =@[@1,@2];
控制臺的輸出只有一個對象,符合我們的預(yù)期
再更改一下程序,將array更改為可修改的,如下:
NSMutableSet* setA = [NSMutableSet new];
NSMutableArray* arrayA = [@[@1,@2] mutableCopy];
[setA addObject:arrayA];
NSMutableArray* arrayB = [@[@1] mutableCopy];
[setA addObject:arrayB];
NSLog(@"setA : %@", setA);
輸出還是有2個array,還是符合我們的預(yù)期
更改一下arrayB的值,使得arrayB與arrayA的內(nèi)容相同,會有什么效果呢?
[arrayB addObject:@2];
NSLog(@"setA after change: %@", setA);
輸出了2個一樣的array,說好的唯一性呢???
如果這時將setA復(fù)制賦值給一個新的set,會怎樣呢:
NSSet* setB = [setA copy];
NSLog(@"setB : %@", setB);
setB又只有一個array,這世界亂套了
經(jīng)過這么折騰后,代碼如下:
NSMutableSet* setA = [NSMutableSet new];
NSMutableArray* arrayA = [@[@1,@2] mutableCopy];
[setA addObject:arrayA];
NSMutableArray* arrayB = [@[@1] mutableCopy];
[setA addObject:arrayB];
NSLog(@"setA : %@", setA);
[arrayB addObject:@2];
NSLog(@"setA after change: %@", setA);
NSSet* setB = [setA copy];
NSLog(@"setB : %@", setB);
總結(jié)如下:
1.盡量不要將可變對象放到set里面去,因為后續(xù)如果更改可變對象,可能會打破set的唯一性
2.set copy的時候會檢測對象的唯一性