28

我有一些NSDictionary对象存储在被NSArray调用的telephoneArray. 我获取键的值,number然后用NSDictionary数组中相同索引处的新对象替换我刚刚读取的值。然后我想将这些新对象放入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

使用上面的代码,telephoneArray 的计数可以在 1 到 5 之间,但 phoneSet 的值始终为 1。我认为有一个明显的错误,但我看不出在哪里。

4

3 回答 3

97

这是不正确的:

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

该方法返回一个您什么都不做的NSSet(它不会将对象添加到telephoneSet,它会创建一个新的NSSet)。改为这样做:

NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]

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

于 2010-03-06T03:02:45.623 回答
11

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

数组可以包含重复项,所以没关系。一个 Set 不能有重复项,并且您的整个 phoneArray 基本上由一个对象组成,所以您只看到一个对象。

在您的循环中,您必须创建一个新对象或从某处获取电话对象:

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]
于 2010-03-06T03:17:53.193 回答
4

斯威夫特 3 版本

你可以从一个数组创建一个新的 NSSet:

let mySet = NSSet(array : myArray)

此外,您可以将数组中的对象添加到已经存在的 NSMutableSet 中。

myMutableSet =  myMutableSet.addingObjects(from: myArray)
于 2017-07-28T18:05:59.613 回答