Как поместить объекты в NSArray в NSSet? - PullRequest
26 голосов
/ 06 марта 2010

У меня есть 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 ]

93 голосов
/ 06 марта 2010

Это не правильно:

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

Этот метод возвращает NSSet, с которым вы ничего не делаете (он не добавляет объекты в telephoneSet, он создает новый NSSet). Сделайте это вместо:

NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]

Также обратите внимание, что набор не может содержать дубликаты в отличие от массива. Поэтому, если у вас есть дубликаты объектов в вашем массиве и вы поместили их в набор, дубликаты будут удалены, что может повлиять на количество объектов.

11 голосов
/ 06 марта 2010

Изначально 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]
2 голосов
/ 28 июля 2017

Swift 3 версия

Вы можете создать новый NSSet из массива с помощью:

let mySet = NSSet(array : myArray)

Кроме того, вы можете добавлять объекты из массива в уже существующий NSMutableSet с помощью.

myMutableSet =  myMutableSet.addingObjects(from: myArray)
...