美文网首页
NSSet:obj-c的唯一集合

NSSet:obj-c的唯一集合

作者: 老虎Alex | 来源:发表于2016-02-26 13:04 被阅读57次

    Objective-C有3种集合类型(collection):array,dictionary,set,他们三者的定义如下:

    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];

    控制台的输出只有一个对象,符合我们的预期

    再更改一下程序,将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,还是符合我们的预期

    更改一下arrayB的值,使得arrayB与arrayA的内容相同,会有什么效果呢?

    [arrayB addObject:@2];

    NSLog(@"setA after change: %@", setA);

    输出了2个一样的array,说好的唯一性呢???

    如果这时将setA复制赋值给一个新的set,会怎样呢:

    NSSet* setB = [setA copy];

    NSLog(@"setB : %@", setB);

    setB又只有一个array,这世界乱套了

    经过这么折腾后,代码如下:

    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);

    总结如下:

    1.尽量不要将可变对象放到set里面去,因为后续如果更改可变对象,可能会打破set的唯一性

    2.set copy的时候会检测对象的唯一性

    相关文章

      网友评论

          本文标题:NSSet:obj-c的唯一集合

          本文链接:https://www.haomeiwen.com/subject/xlhwkttx.html