В любом случае, чтобы получить строку из имени переменной?
Скажем, у меня есть класс
@interface Person : NSObject { NSString *name; }
Мне нужно получить имя NSString в моем классе
Person *person = [[Person alloc] init];
NSLog(@"Name of variable %s\n", _NameofVariable_(person->name));
Спасибо за ответы, вот решение, которое я выбрал из ответов
//returns nil if property is not found
-(NSString *)propertyName:(id)property {
unsigned int numIvars = 0;
NSString *key=nil;
Ivar * ivars = class_copyIvarList([self class], &numIvars);
for(int i = 0; i < numIvars; i++) {
Ivar thisIvar = ivars[i];
if ((object_getIvar(self, thisIvar) == property)) {
key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
break;
}
}
free(ivars);
return key;
}
Ответы
Ответ 1
Вы можете получить имена переменных экземпляра класса с помощью Objective-C API среды выполнения class_copyIvarList
. Однако это скорее связано, редко делается и почти никогда не является лучшим способом добиться чего-то. Если у вас есть более конкретная цель, чем просто любопытство, может быть неплохо спросить о том, как выполнить ее в Objective-C.
Кроме того, кстати, person.name
не указывает переменную экземпляра в Objective-C - это вызов свойства. Переменная экземпляра будет person->name
.
Ответ 2
Так же легко, как
#define VariableName(arg) (@""#arg)
Затем выполните следующие действия:
NSObject *obj;
NSString *str = VariableName(obj);
NSLog(@"STR %@", str);//obj
Ответ 3
Вы можете использовать препроцессорную строчку и немного спрятать строки:
NSUInteger lastIndexAfter(NSUInteger start, NSString *sub, NSString *str) {
NSRange found = [str rangeOfString:sub options:NSBackwardsSearch];
if(found.location != NSNotFound) {
NSUInteger newStart = NSMaxRange(found);
if(newStart > start)
return newStart;
}
return start;
}
NSString *lastMember(NSString *fullName) {
if(!fullName) return nil;
NSUInteger start = 0;
start = lastIndexAfter(start, @".", fullName);
start = lastIndexAfter(start, @"->", fullName);
return [fullName substringFromIndex: start];
}
#define NSStringify(v) (@#v)
#define _NameofVariable_(v) lastMember(NSStringify(v))
Ответ 4
Если объект человека отображается как свойство класса, вы можете использовать objc_msgSend для получения значения.
Итак, если вы можете получить доступ к человеку с помощью
[object person]
Вы также можете сделать
objc_msgSend(object, "person")
Подробнее о отправке сообщений, в том числе о том, как передать аргументы методам, см. в разделе Objective-C Раздел "Руководство по программированию времени выполнения" в разделе "Сообщения"
Ответ 5
Следующее работает как макрос:
#define STRINGIZE(x) #x