Есть ли способ указать класс объектов NSMutableArray? - PullRequest
0 голосов
/ 31 декабря 2011

У меня возникла следующая проблема:

Я создал NSMutableArray «массив», который будет содержать объекты класса с именем «Class». В начале этот массив должен быть пустым и заполняться во время выполнения программы.

Поскольку я никогда не говорил компилятору, что мой NSMutableArray будет содержать элементы класса Class, когда я пытаюсь написать соответствующие методы, компилятор не позволит мне сделать это.

Это мой первый опыт разработки Objective-C и iPhone. Я использовал для программирования на C / C ++, где я объявил свои массивы следующим образом:

Class array[NUMBEROFELEMENTS];

Есть ли способ сделать это в Objective-C?

Спасибо!

Ответы [ 3 ]

1 голос
/ 01 января 2012

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

Хитрость в том, что когда вы вытаскиваете объект из массива, вам нужно создать новый указатель на основе соответствующего типа:

MyObject *myObject = [myArray objectAtIndex:0];

Тогда вы можете использовать объект так, как вам нравится:

[myObject doThatThingWithThisValue:10];

или все, что вам нужно.

0 голосов
/ 31 декабря 2011

Ну, у вас все еще могут быть массивы в стиле C. В Objective-C.

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

Имеет NSArray и NSMutableArray, которые не специализированы для определенного класса.Он может хранить объекты несовместимых классов.

Вы можете использовать следующую идиому: [obj isMemberOfClass: [Class type]], чтобы убедиться, что элемент массива имеет требуемый тип и затем приведен к Class*.

* 1012.* Вы также можете использовать цикл for-each (aka Fast Enumeration):
NSMutableArray* array = //... initialize your array
for (Class* elm in array) {
     elm.your_property = 10;
}
0 голосов
/ 31 декабря 2011

Массивы в Objective-C Какао являются объектами (а также другими коллекциями, наборами, словарями).Массивы могут содержать ссылки на объекты любого типа, поэтому тип для массива просто NSArray, NSMutableArray и т. Д.

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

Я предлагаю вам взглянуть на превосходные темы по программированию коллекций Apple , в которых объясняются основы коллекций.

Вот краткий пример:

// two objects of different types
NSNumber *n = [NSNumber numberWithInteger:10];
NSString *s = @"foo";

// alloc/init a new mutable array
NSMutableArray *a = [NSMutableArray arrayWithCapacity:10];
// add an object
[a addObject:n];
[a addObject:s];
// array a now contains a NSNumber and a NSString
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...