2012-02-24 2 views
1

Есть ли способ объявить массив пользовательского типа класса в ios. например, если у меня есть собственный класс GenericProduct, существует ли способ объявить массив объектов этого типа только в ios вместо NSArray или NSMutableArray.Объявление массивов известных типов пользовательских типов в obj C/ios

Заранее спасибо

ответ

0

Не совсем, хотя потенциально можно подклассы и обеспечить только допустимые типы были введены в класс.

В центре, хотя Objective-C представляет собой динамически типизированную систему, поэтому немного неестественно создавать типы контейнеров таким образом, и вы можете неожиданно сломаться в результате (например, что происходит, когда парсер JSON возвращает вам смесь NSNumber, NSString и NSNull объекты?

+0

Я согласен, спасибо так много .. – inforeqd

1

Поскольку все объекты Objective-C находятся в сердце с-структур, можно просто объявить это обычный массив ваших Objective-C объектов, как

GenericProduct *array[5]; 

или если вы означает принудительное выполнение проверки типов при вставке объекта в массив, потенциально вы можете подклассифицировать класс NSMutableArray для выполнения chec король, хотя это действительно не нужно само по себе.

+0

однако, если я сделаю это, я думаю, у меня будет выделять память с помощью таНос и не будет иметь возможность использовать удобство инициализаторы nsarray и т. д. – inforeqd

+0

Да, вам нужно будет, если вы не хотите подкласс NSArray/NSMutableArray выполнять проверку типов. Серьезно, однако, вы должны использовать общий NSArray и выполнять проверку типа в другом месте. – futureelite7

+0

Благодарим вас за подтверждение :-) .. Думаю, я выберу дизайн, чтобы быть динамичным, а не подклассифицироваться. – inforeqd

0

Теперь с помощью Generics вы определяете, какой тип NSArray содержит.

Например:

NSMutableArray<GenericProduct *> *array = [NSMutableArray array]; 

То же самое можно сделать в Swift

var array = [GenericProduct]() 

или более явно

var array = Array<GenericProduct>() 

Теперь Swift будет строго следить за соблюдением этого проверку типов. Хотя в ObjC это просто руководство для человеческих разработчиков и не будет вызывать ошибки во время компиляции.

Очевидно, что есть еще опция массива C, которая @ futureelite7 упоминается.

Реальный пример мира, используя Apple's ObjC Runtime Library

int numberOfClasses = objc_getClassList(NULL, 0); 
Class *classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numberOfClasses); 
numberOfClasses = objc_getClassList(classes, numberOfClasses); 
for (int i = 0; i < numberOfClasses; i++) { 
    Class class = classes[i]; 
    //do something with it 
}