为 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 定义宏不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的简单 C 宏不起作用?

Word 2010 宏不起作用

为啥这个 Common Lisp 宏不起作用?书上的答题卡错了吗?

保存excel文件后运行宏不起作用

为啥这个在 Common Lisp 中漂亮地打印宏扩展的宏不起作用?都有哪些替代工具?

如何在 VS 2010 中出现第一个错误时停止 C# 编译(VS 2008 宏不起作用)!