28

呼び出された にいくつかのNSDictionaryオブジェクトが格納されています。キーの値をフェッチし、読み取ったばかりの値を配列内の同じインデックスにある新しいオブジェクトに置き換えます。次に、これらの新しいオブジェクトを. これはどのように達成できますか?以下の失敗した試みを参照してください。NSArraytelephoneArraynumberNSDictionaryNSSet

    // 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 ですが、telephoneSet の値は常に 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

配列には重複を含めることができるため、問題ではありません。セットは重複を持つことはできません。また、電話配列全体は基本的に単一のオブジェクトで構成されているため、表示されるのは 1 つだけです。

ループでは、新しいオブジェクトを作成するか、どこかから電話オブジェクトを取得する必要があります。

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 に答える