У меня есть массив пользовательских объектов, но я не могу NSLog свойство отдельного объекта в этом массиве, потому что вы можете хранить любые объекты в массиве. Как мне это сделать?Как получить свойство объекта в массиве объектов Objective C?
ответ
Объектив-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)];
Вышеприведенный ответ верен для доступа к отдельным полям. Также, как примечание, есть также интересные трюки, которые вы можете использовать с кодированием пути ключа и Операторы коллекции, когда у вас есть коллекция, подобная массиву. Например, если у вас есть большой массив объектов с небольшим числом значений для одного поля:
NSArray *allObjects;
вы можете создать массив со всеми уникальными значениями одного из ваших полей с утверждением:
NSArray *values=[allObjects valueForKeyPath:@"@distinctUnionOfObjects.myObjectsInterestingProperty"];
или вы можете найти среднее значение поля с утверждением:
NSNumber *average=[allObjects valueForKeyPath:@"@avg.myObjectsInterestingProperty"];
Все другой путь ключ-значение Коллекция операторов вы можете использовать этот способ, перечислены в Apple's Key-Value Programming Guide
Все объекты в вашем массиве того же типа? Если да, не можете ли вы отбросить объект и получить доступ к тому, что вам нужно? –
Кастинг не требуется в Objective-C, так как Runtime предлагает достойную степень самоанализа. – vikingosegundo