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);
看看控制臺(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,說好的唯一性呢真屯?脸候??
如果這時(shí)將setA復(fù)制賦值給一個(gè)新的set绑蔫,會(huì)怎樣呢:
NSSet* setB = [setA copy];
NSLog(@"setB : %@", setB);
setB又只有一個(gè)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.盡量不要將可變對(duì)象放到set里面去配深,因?yàn)楹罄m(xù)如果更改可變對(duì)象携添,可能會(huì)打破set的唯一性
2.set copy的時(shí)候會(huì)檢測(cè)對(duì)象的唯一性