2013-07-27 2 views
4

Использования лязга и Objective-C Я задаюсь вопросом, могу ли я получить печатную строку, описывающую тип потенциально нулевого параметра (т.е. во время компиляции только один типа информации.)Версия для печати типа строки из параметра

Например, что-то вроде :

- (void)myFunc:(NSString *)aNilString { 
    NSLog(@"%s", __typeof__(aNilString)); 
} 

Очевидно, что это не сработает, потому что __typeof__ получает мне фактический тип, а не строку. В C++ у нас есть typeid, который возвращает std :: type_info, но это имя искажено, например. «P12NSString *», а не «NSString *».

В идеале мне бы хотелось что-то, что можно передать в функции objc_getClass(). Есть ли способ получить то, что я хочу?

Изменить: Я хотел бы, чтобы не иметь для компиляции, как C++, так что это решение из:

abi::__cxa_demangle(typeid(*aNilString).name(), 0, 0, 0)); 

ответ

0

Чтобы получить строку, которая может быть передана в функцию как objc_getClass() просто использовать описание объект класса.

В этом примере я изменил тип своего аргумента от NSString * к id, так как если вы уже знали, что этот аргумент был NSString *, то этот вопрос будет отчасти спорным. Обратите внимание, что я вызываю метод class передаваемого объекта, а затем метод description класса, чтобы получить NSString *, который описывает класс и может использоваться с методами, которые вы ссылаетесь.

Заметим также, что если объект является nil, то нет никакого класса и вызов description просто вернет ноль и NSLog напечатает (null). Вы не можете определить тип указателя во время выполнения, потому что это просто указатель на объект класса (и этого не существует для nil).

- (void)myFunc:(id)aClassObject { 
    // Get the description of aClassObject's class: 
    NSString *classString = [[aClassObject class] description]; 
    NSLog(@"%@", classString); // Prints __NSCFConstantString 

    // Bonus: Get a new object of the same class 
    if ([classString length] > 0) { 
     id theClass = objc_getClass([classString UTF8String]); 
     id aNewObjectOfTheSameType = [[theClass alloc] init]; 
     NSLog(@"%@", [[aNewObjectOfTheSameType class] description]); // Prints __NSCFConstantString 
    } 
} 
+0

Я знаком со всем добросовестным исполнением. Я знаю, что технически тип известен, поэтому это должно быть тривиально, однако, чтобы сократить длинную историю, эта функция генерируется последовательностью макросов, что делает тип параметра более сложным, чем вы думаете, следовательно, вопрос. – Tim

+0

Если вы генерируете код, @Tim, почему не удается просто создать еще одну копию имени типа? '[ClassName class]' предоставит вам объект класса, даже если метод получит 'nil'. –

+0

Это, в конечном счете, то, что я сделал. Я просто подумал, что это интересный вопрос. – Tim

Смежные вопросы