Как поместить объекты в NSArray в NSSet?
У меня есть немного 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
С кодом выше, phoneArray может иметь счет от 1 до 5, но phoneSet всегда имеет значение 1. Я предполагаю, что есть очевидная ошибка, но я не могу видеть, где.
3 ответа
Это не правильно
NSSet *telephoneSet = [[NSSet alloc] init];
[telephoneSet setByAddingObjectsFromArray:telephoneArray];
Этот метод возвращает NSSet, с которым вы ничего не делаете (он не добавляет объекты в telephoneSet, он создает новый NSSet). Сделайте это вместо этого:
NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]
Также обратите внимание, что набор не может содержать дубликаты в отличие от массива. Таким образом, если у вас есть дубликаты объектов в вашем массиве и вы поместили их в набор, дубликаты будут удалены, что может повлиять на количество объектов.
Первоначально telephoneArray
содержит ссылки на n
отдельные объекты. После окончания цикла он содержит n
ссылки, но каждый указывает на то же newTelephone
объект.
Массив может содержать дубликаты, поэтому это не имеет значения. Набор не может иметь дубликатов, и весь ваш 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]
Версия Swift 3
Вы можете создать новый NSSet из массива с помощью:
let mySet = NSSet(array : myArray)
Кроме того, вы можете добавлять объекты из массива в уже существующий NSMutableSet с помощью.
myMutableSet = myMutableSet.addingObjects(from: myArray)