为 UIFont 定义宏不起作用
Posted
技术标签:
【中文标题】为 UIFont 定义宏不起作用【英文标题】:Define macro for UIFont doesn't work 【发布时间】:2013-06-27 09:26:57 【问题描述】:我想定义一个宏来统一我的应用程序中的所有字体:
#define EXO_REGULAR_FONT(size) [UIFont fontWithName:@"Exo-Regular" size:size]
而不是像这样使用这个宏:
myLabel.font = EXO_REGULAR_FONT(15);
但是编译器给了我这个错误:
(15下有个箭头)。
有什么想法可以解决吗?谢谢
【问题讨论】:
【参考方案1】:更改参数名称:
#define EXO_REGULAR_FONT(theFontSize) [UIFont fontWithName:@"Exo-Regular" size:theFontSize]
来自GCC manual:
当宏展开时,其主体中参数的每次使用都会被相应参数的标记替换
所以当你的宏展开时,它会在你的代码中插入这个,因此会出现编译错误:
[UIFont fontWithName:@"Exo-Regular" 15:15]
【讨论】:
swift-4 有什么可能的解决方案? @Anita 请参阅下面 Nikolai 的回答及其 cmets。在 Swift 中执行此操作的一个好方法是将其添加为 UIFont 的扩展。【参考方案2】:#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】:不要使用宏;他们是邪恶的(你只是经历了众多原因之一)。
改用函数:
static inline UIFont *ExoRegularFont(CGFloat size)
return [UIFont fontWithName:@"Exo-Regular" size:size];
【讨论】:
将其保存在类似于 macros.h 的内容中并将其附加到您的 pch 中会是不好的做法吗? @BooRanger 一点也不。绝对比#define
更好、更安全。
UIFont 上的类别也是处理自定义字体的好方法。类似于+systemFontOfSize:
,我在我的应用程序中使用+appFontOfSize:
、+boldAppFontOfSize:
、+headingFont
、...。
@MatthiasBauch 您应该将此评论添加为新答案。【参考方案4】:
#define EXO_REGULAR_FONT(s) [UIFont fontWithName:@"Exo-Regular" size:s]
【讨论】:
以上是关于为 UIFont 定义宏不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 Common Lisp 宏不起作用?书上的答题卡错了吗?