代码之家  ›  专栏  ›  技术社区  ›  conorgriffin

如何将NSarray中的对象放入NSset?

  •  26
  • conorgriffin  · 技术社区  · 16 年前

    我有一些 NSDictionary 对象存储在 NSArray 打电话 telephoneArray . 我获取键的值 number 然后更换 字典 我刚刚用数组中相同索引的新对象进行了阅读。然后我想把这些新物体放到 NSSet . 如何实现这一目标?请看下面我的失败尝试。

        // Add all telephones to this branch
        for (int i=0; i<[telephoneArray count]; i++) {
    
            [newTelephone setBranch:newBranch];
            [newTelephone setNumber:[[telephoneArray objectAtIndex:i] valueForKey:@"number"]];
    
            NSLog(@"%@",[[telephoneArray objectAtIndex:i] valueForKey:@"number"]);
            [telephoneArray replaceObjectAtIndex:i withObject:newTelephone];
            NSLog(@"phone number %i = %@",i,[[telephoneArray objectAtIndex:i] valueForKey:@"number"]);
    
        }
    
        NSSet *telephoneSet = [NSSet setWithArray:telephoneArray];
    
        NSLog(@"telephoneArray=%i",[telephoneArray count]);
        NSLog(@"telephoneSet=%i",[[telephoneSet allObjects] count]);
    

    输出:

    2010-03-06 03:06:02.824 AIB[5160:6507] 063 81207
    2010-03-06 03:06:02.824 AIB[5160:6507] phone number 0 = 063 81207
    2010-03-06 03:06:02.825 AIB[5160:6507] 063 81624
    2010-03-06 03:06:02.825 AIB[5160:6507] phone number 1 = 063 81624
    2010-03-06 03:06:02.825 AIB[5160:6507] 063 81714
    2010-03-06 03:06:02.826 AIB[5160:6507] phone number 2 = 063 81714
    2010-03-06 03:06:02.826 AIB[5160:6507] 063 81715
    2010-03-06 03:06:02.826 AIB[5160:6507] phone number 3 = 063 81715
    2010-03-06 03:06:02.826 AIB[5160:6507] telephoneArray=4
    2010-03-06 03:06:02.827 AIB[5160:6507] telephoneSet=1
    

    有了上面的代码,电话阵列的计数可以在1到5之间,但是电话组的值总是1。我想有个明显的错误,但我不知道在哪里。

    3 回复  |  直到 8 年前
        1
  •  92
  •   indragie    16 年前

    这是不正确的:

    NSSet *telephoneSet = [[NSSet alloc] init];
    [telephoneSet setByAddingObjectsFromArray:telephoneArray];
    

    该方法返回一个与您无关的nsset(它不会将对象添加到电话集,而是创建一个新nsset)。改为这样做:

    NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]

    另外,请注意,集合不能包含与数组不同的重复项。因此,如果在数组中有重复的对象,并将它们放在一个集合中,则重复的对象将被删除,这可能会影响对象计数。

        2
  •  11
  •   Anurag    16 年前

    最初 telephoneArray 包含对的引用 n 不同的对象。循环结束后,它确实包含 n 引用,但每个引用都指向同一个引用 newTelephone 对象。

    数组可以包含重复项,所以不重要。一个集合不能有重复项,整个电话数组基本上由一个对象组成,所以您只看到一个对象。

    在循环中,您必须创建一个新对象或从以下位置获取电话对象:

    for (int i=0; i<[telephoneArray count]; i++) {
        // Create the new object first, or get it from somewhere.
        Telephone *newTelephone = [[Telephone alloc] init];
        [newTelephone setBranch:newBranch];
        [newTelephone setNumber:[[telephoneArray objectAtIndex:i] valueForKey:@"number"]];
        [telephoneArray replaceObjectAtIndex:i withObject:newTelephone];
        // the array holds a reference, so you could let go of newTelephone
        [newTelephone release];
    }
    

    而且,就像pcwiz说的,你不需要分配一个新的 NSSet 反对。只需调用类方法 setWithArray: .

    NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]
    
        3
  •  2
  •   Kyle Somers    8 年前

    斯威夫特3版

    您可以使用以下命令从阵列创建新的nsset:

    let mySet = NSSet(array : myArray)
    

    此外,还可以将数组中的对象添加到已存在的nsmutableset中。

    myMutableSet =  myMutableSet.addingObjects(from: myArray)