Создание массива, который содержит только объекты данного класса - PullRequest
1 голос
/ 13 июля 2009

Хорошо, у меня есть приведенный ниже код (Objective-C FYI), и мне было интересно, хочу ли я создать NSMutableArray из c_data объектов, как мне поступить? Это все равно что объявить List<c_data> cData в C #.

@interface c_data : NSObject {
    double value;
    int label;
    int ID;
}    
@property double value;
@property int label;
@property int ID;

-(c_data*) init;
-(c_data*) initWithValue:(double)value;    
@end

@implementation c_data
@synthesize value, label, ID;
-(c_data*) init {
    return self;
}
-(c_data*) initWithValue:(double)val {
    value = val;
    return self;
}
@end

Если вы посмотрите на класс feat_data, я пытаюсь сделать cData массивом класса c_data. Я включил свои попытки, но я не думаю, что это правильно, потому что c_data не массив. Какие-либо предложения?

@interface feat_data : NSObject {
    NSMutableArray *nData;
    NSMutableArray *cData;
    char type;
}
@property(nonatomic, retain) NSMutableArray *nData;
@property(nonatomic, retain) NSMutableArray *cData;
@property char type;
-(feat_data*)init;
@end

@implementation feat_data
@synthesize nData, cData, type;
-(feat_data*)init {
    nData = [[NSMutableArray alloc] init];
    c_data *c_dataInstance = [[c_data alloc] init];
    cData = [[NSMutableArray alloc] initWithArray:c_dataInstance];
    return self;
}
@end

Ответы [ 3 ]

3 голосов
/ 14 июля 2009

В Objective-C нет такого понятия, как статически типизированные / шаблоны / общие коллекции. По сути, цель строго типизированной коллекции - обеспечить безопасность статического типа во время компиляции. Такой подход не имеет смысла в таком динамическом языке, как Objective-C. Подход к проблеме разнородных типов объектов в коллекциях Objective C состоит в том, чтобы вставлять только соответствующие типы объектов . (Также помните, что массив будет содержать объекты, которые он содержит, поэтому, если вы вставляете новый объект без освобождения и теряете указатель на него, вы теряете память.)

Если подумать, одним из самых больших преимуществ дженериков является возможность извлечения объектов из коллекции непосредственно в статически типизированную переменную без приведения. В Objective-C вы можете просто сохранить переменную id и отправить любое сообщение, которое вам нравится, не беспокоясь о ClassCastException, или компилятор, жалующийся, что объект не (не может?) Реализовать метод, который вы пытаетесь вызов. Вы по-прежнему можете статически печатать переменные и приводить результаты при желании, но более простой подход заключается в использовании динамической типизации (и -isKindOfClass: и -respondsToSelector: при необходимости).

Между прочим, есть несколько связанных воплощений этого вопроса о переполнении стека. Знание термина (ов) для поиска («универсальный», «строго типизированный» или «шаблон») может помочь найти их. Вот некоторые из них:

Наконец, я согласен с Уильямом - ваши методы инициализации довольно вопиющие в приведенном вами примере. Хорошо бы выучить и прислушаться к правилам Apple Выделение и инициализация объектов в Objective-C. Это требует ломать привычки от других языков, но это сэкономит вам бесконечные часы безумия в какой-то момент в будущем. : -)

2 голосов
/ 13 июля 2009
[NSMutableArray addObject:[[[c_data alloc] init] autorelease]];

Массивы Objective-C не типизированы. Похоже, у вас есть кое-что отученное от C ++.

С другой стороны, ваши начальные звуки довольно плохие. Вам также нужно вызвать super init, как таковой:

- (id)init {
  self = [super init];
  if (self != nil) {
    //Initialize here.
  }
  return self;
}
2 голосов
/ 13 июля 2009

Вы должны создать NSMutableArray и вставить в него c_data объекты.

...