2013-06-27 3 views
5

Я хочу, чтобы определить макрос для объединения всех шрифтов в моем приложении:Определить макрос для UIFont не работает

#define EXO_REGULAR_FONT(size) [UIFont fontWithName:@"Exo-Regular" size:size] 

и чем при использовании этого макроса так:

myLabel.font = EXO_REGULAR_FONT(15); 

но компилятор податливости меня эта ошибка:

enter image description here

(имеется стрелка под 15).

Любые идеи для решения? Благодаря

ответ

12

Изменить имя вашего параметра:

#define EXO_REGULAR_FONT(theFontSize) [UIFont fontWithName:@"Exo-Regular" size:theFontSize] 

От GCC manual:

When the macro is expanded, each use of a parameter in its body is replaced by the tokens of the corresponding argument

Так что, когда макрос расширяется, он вставляет это в коде, поэтому ошибка компиляции:

[UIFont fontWithName:@"Exo-Regular" 15:15] 
4
#define EXO_REGULAR_FONT(size) [UIFont fontWithName:@"Exo-Regular" size:size] 

получает расширяется, когда вы звоните EXO_REGULAR_FONT(15), чтобы

[UIFont fontWithName:@"Exo-Regular" 15:15] 

Так что вам нужно определить его, как это, например:

#define EXO_REGULAR_FONT(_size_) [UIFont fontWithName:@"Exo-Regular" size:_size_] 
3
#define EXO_REGULAR_FONT(s) [UIFont fontWithName:@"Exo-Regular" size:s] 
5

Не используйте макрос; они злы (вы просто испытали одну из многих причин).

Используйте функцию вместо:

static inline UIFont *ExoRegularFont(CGFloat size) { 
    return [UIFont fontWithName:@"Exo-Regular" size:size]; 
} 
+0

бы быть плохая практика, чтобы держать это в нечто похожее на macros.h и прикрепить его в PCH? – BooRanger

+0

@BooRanger Нет. Определенно намного лучше и безопаснее, чем '# define'. –

+1

категория в UIFont также будет хорошим способом обработки пользовательских шрифтов. Подобно '+ systemFontOfSize:' Я использую '+ appFontOfSize:', '+ boldAppFontOfSize:', '+ headingFont', ... в моих приложениях. –