2012-01-15 3 views
3

У меня есть массив пользовательских объектов, но я не могу NSLog свойство отдельного объекта в этом массиве, потому что вы можете хранить любые объекты в массиве. Как мне это сделать?Как получить свойство объекта в массиве объектов Objective C?

+0

Все объекты в вашем массиве того же типа? Если да, не можете ли вы отбросить объект и получить доступ к тому, что вам нужно? –

+1

Кастинг не требуется в Objective-C, так как Runtime предлагает достойную степень самоанализа. – vikingosegundo

ответ

6

Объектив-C предлагает несколько introspection techniques через систему ее запуска.

Вы можете задать объект, если он определен из определенного вида, или ответы на определенное сообщение.

for (id anObject in array){ 
    if([anObject isKindOfClass:[MyClass class]]){ 
     MyOtherClass *obj = anObject.myProperty ; 
     NSLog(@"%@", obj); 
    } 
} 

и

for (id anObject in array){ 
    if([anObject respondsToSelector:@selector(aMethod)]) { 
     NSLog(@"%@",[anObject aMethod]); 
    } 
} 

как свойства обычно приводит к синтезируемых методов, второй способ также должен работать на них.

также упомянуть - хотя и не в рамках этого вопроса:

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

[[anObject class] conformsToProtocol:@protocol(MyProtocol)]; 
2

Вышеприведенный ответ верен для доступа к отдельным полям. Также, как примечание, есть также интересные трюки, которые вы можете использовать с кодированием пути ключа и Операторы коллекции, когда у вас есть коллекция, подобная массиву. Например, если у вас есть большой массив объектов с небольшим числом значений для одного поля:

NSArray *allObjects; 

вы можете создать массив со всеми уникальными значениями одного из ваших полей с утверждением:

NSArray *values=[allObjects valueForKeyPath:@"@distinctUnionOfObjects.myObjectsInterestingProperty"]; 

или вы можете найти среднее значение поля с утверждением:

NSNumber *average=[allObjects valueForKeyPath:@"@avg.myObjectsInterestingProperty"]; 

Все другой путь ключ-значение Коллекция операторов вы можете использовать этот способ, перечислены в Apple's Key-Value Programming Guide