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ですが、telephoneSetの値は常に1です。明らかな間違いがあると思いますが、どこにあるかはわかりません。
これは正しくありません:
NSSet *telephoneSet = [[NSSet alloc] init];
[telephoneSet setByAddingObjectsFromArray:telephoneArray];
このメソッドは、何もしていないNSSetを返します(オブジェクトをtelephoneSetに追加せず、新しいNSSetを作成します)。代わりにこれを行ってください:
NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]
また、配列とは異なり、セットに重複を含めることはできません。したがって、配列に重複するオブジェクトがあり、それらをセットに入れると、重複が削除され、オブジェクト数に影響を与える可能性があります。
最初はtelephoneArray
にn
異なるオブジェクトへの参照が含まれています。ループが終了すると、n
参照が含まれますが、それぞれが同じnewTelephone
オブジェクトを指しています。
配列には重複が含まれている可能性があるため、問題ではありません。セットは重複を持つことができず、telephoneArray全体は基本的に単一のオブジェクトで構成されているため、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]
次のようにして、配列から新しいNSSetを作成できます。
let mySet = NSSet(array : myArray)
さらに、配列から既存のNSMutableSetにオブジェクトを追加できます。
myMutableSet = myMutableSet.addingObjects(from: myArray)