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