NSMutableSet не добавляет более 1 объекта

Я создаю объект метки (CorePlot) в цикле for и пытаюсь добавить его в NSMutableSet, которому мне нужно передать параметр.

Странно, что в NSMutableSet добавляется только один объект (первый), а остальные не добавляются.

Похоже, мне не хватает чего-то очень простого.

Любой совет?

Я прилагаю скриншоты кода, так как хочу показать значения, хранящиеся в объекте NSSet.

Изображение 1. Объекты добавляются в NSMutableArray, но не в NSSet. Формирование из этого массива

Объекты добавляются в NSMutableArray, но не в NSSet, формируемый из этого массива

Код, используемый на изображении 1 -

    NSArray *months = [NSArray arrayWithObjects:@"Oct",@"Nov",@"Dec",@"Jan",@"Feb",nil];
NSMutableArray *xLabels = [[NSMutableArray alloc] init];
for (NSString *month in months) {
    CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:month textStyle:axisTextStyle];
    [xLabels addObject:label];
}
NSSet *xLabelSet = [NSSet setWithArray:xLabels];
x.axisLabels = xLabelSet;

Изображение 2. Объекты не добавляются в NSMutableSet Объекты не добавляются в NSMutableSet

Код, используемый на изображении 2 -

    NSArray *months = [NSArray arrayWithObjects:@"Oct",@"Nov",@"Dec",@"Jan",@"Feb",nil];
//NSMutableArray *xLabels = [[NSMutableArray alloc] init];
NSMutableSet *xLabelSet = [[NSMutableSet alloc] initWithCapacity:[months count]];
for (NSString *month in months) {
    CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:month textStyle:axisTextStyle];
    [xLabelSet addObject:label];
}
//NSSet *xLabelSet = [NSSet setWithArray:xLabels];
x.axisLabels = xLabelSet;

person Dev    schedule 10.04.2015    source источник
comment
Реализует ли класс isEqual и hash?   -  person Wain    schedule 10.04.2015
comment
В будущем вы также можете вставить значения. Трудно скопировать и вставить код с изображения.   -  person Lajos Arpad    schedule 10.04.2015
comment
В первом коде вы вообще не используете xLabels. Во втором коде вы инициализируете с помощью [[NSMutableSet alloc] initWithCapacity:[month count]] и следующее, что вы делаете, это назначаете его x.axisLabels.   -  person Lajos Arpad    schedule 10.04.2015
comment
@Wain - Да, это так. Проверил в исходных файлах фреймворка. Это класс - core-plot.googlecode.com/hg /документация/html/iOS/   -  person Dev    schedule 10.04.2015
comment
@LajosArpad - извините за это. Выложу код. Чтобы ответить на ваши вопросы... В первом коде я добавляю объекты в xLabels (NSMutableArray) в строке 195 и пытаюсь создать NSSet (xLabelSet) в строке 197 из xLabels. Во втором коде я добавляю объекты в xLabelSet в строке 196.   -  person Dev    schedule 10.04.2015
comment
Не размещайте изображения кода. Используйте копирование/вставку.   -  person Hot Licks    schedule 10.04.2015


Ответы (2)


В документации по методу isEqual для CPTAxisLabel сказано:

Метки осей равны, если они имеют одинаковое значение tickLocation.

Поскольку вы не указываете свойство tickLocation для добавляемых меток, все они будут иметь одинаковые tickLocation - 0.

Поскольку isEqual возвращает true для всех ваших меток, вы получаете только первую из них в NSSet — добавление последующей метки пропускается, поскольку эквивалентный объект уже находится в наборе.

person Paulw11    schedule 10.04.2015
comment
Хорошо ... это имеет смысл ... спасибо ... уже давно ломаю голову над этим :) - person Dev; 10.04.2015
comment
Есть ли другой способ отображать метки в том же месте галочки? - person Tejas Ardeshna; 28.11.2016

Я не вижу ошибки в вашем коде, но я бы предложил использовать CFMutableSetRef, так как он имеет возможность бесплатного моста. Его использование позволит вам указать его в качестве нужного вам параметра.

Возможно, использование сообщений (методов) из CFMutableSetRef позволит вам добавить больше объектов.

Еще одна вещь, которую я бы попробовал, - это просто создать массив с CPTAxisLabels и использовать метод addObjectsFromArray из NSMutableSet и проверить, работает ли это.

person Joze    schedule 10.04.2015
comment
Спасибо @Joze ... можете ли вы привести пример кода для CFMuableSetRef? Я пытался использовать его, но нет методов инициализации. Пробовал инициализировать с помощью CFMutableSet, но он говорит, что неявное преобразование не разрешено в ARC. Также уже пробовал addObjectsFromArray, но он не работает. - person Dev; 10.04.2015
comment
@Dev Я думаю, вам нужно использовать CFDataCreateMutable, чтобы инициализировать его. Как 2_. Теперь я думаю, что ответ Paulw11 может быть более точным. - person Joze; 10.04.2015