4

Предположим, у вас есть класс «Foo» с свойством «testProperty». Цель состоит в том, чтобы получить имя свойства (не значение) как NSString. Вопрос, вероятно, дублируется Get property name as a string. Но ответы не помогли мне, потому что:Получить имя свойства объекта как строку в Objective-C

  • Мне не нужны все свойства. Мне нужен только конкретный.
  • Для NSStringFromSelector(@selector(prop)) - в любом случае вам нужно ввести строку.

Пусть у меня есть функция, как

- (NSString *)propertyToString:(id)propertyOfObject 

В этом случае я могу использовать, например, для сортировки

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:[self propertyToString:foo.testProperty] ascending:NO]; 

Итак, наконец, код будет чист.

+5

Вы сказали - «Я хочу одного конкретного, не все». ... ммм ... как бы вы знали, какой именно вы хотите, если бы не знали его имени? И если бы вы знали, просто создайте строку самостоятельно ...? – Michal

+1

Ваш вопрос является дубликатом того, с которым вы связались. Просто сделайте так, как в ответе, который вы связали, и, перейдя по всем свойствам, просто сохраните тот, который вы хотите, и проигнорируйте остальные. – Volker

+0

@ Michal, я хотел бы сделать мой код чистым, поэтому я не хочу использовать строковые константы. – razor28

ответ

0

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

+0

Входной файл foo.testProperty. – razor28

+0

@ razor28. Вы нашли решение для этого? –

0

Код не проверен. Должен быть STH нравится:

#import <objc/runtime.h> 

Class cls = [Foo class]; 
u_int count; 
objc_property_t* props = class_copyPropertyList(cls,&count); 
for(int i=0;i<count;i++){ 
    NSString* propname = [NSString stringWithUTF8String:property_getName(props[i])]; 
    if([propname hasPrefix:@"test"]) 
     NSLog(@"foo"); 
} 

Ваш поиск способ выбрать подмножество множества проп. Единственное, что вы можете сделать, это применить какой-то фильтр - может быть соглашение об именах таких свойств, как выше, - чтобы уменьшить набор свойств до желаемых.

+0

Цель состоит в том, чтобы не использовать строковые константы. Вход должен быть foo.testProperty. – razor28