Objective-C宏定义语言检测逻辑问题求助
正确实现基于当前语言的Objective-C宏
你原来的代码逻辑失效的核心原因是混淆了预处理阶段和运行时的执行时机:#ifdef是预处理指令,只检查宏是否被定义,完全不关心宏的实际值;而获取系统首选语言是运行时才能完成的操作,没法在预处理阶段用来做分支判断。
下面是两种可行的实现方案:
方案一:使用运行时计算的宏
直接定义一个展开为三目运算符表达式的宏,让它在运行时根据当前语言返回对应字符串:
#define APP_LOCALE \ ([[[NSLocale preferredLanguages] firstObject] isEqualToString:@"nl_NL"] ? @"&locale=nl_NL" : @"&locale=en_US")
使用时直接当作NSString对象使用即可,比如:
NSString *apiUrl = [NSString stringWithFormat:@"https://example.com/api%@", APP_LOCALE];
方案二:使用静态inline函数(推荐)
宏容易引发语法问题和可读性问题,更推荐用静态inline函数实现,逻辑更清晰:
static inline NSString *APP_LOCALE(void) { NSString *preferredLanguage = [[NSLocale preferredLanguages] firstObject]; if ([preferredLanguage isEqualToString:@"nl_NL"]) { return @"&locale=nl_NL"; } else { return @"&locale=en_US"; } }
使用方式:
NSString *apiUrl = [NSString stringWithFormat:@"https://example.com/api%@", APP_LOCALE()];
额外说明
- 避免用
==比较NSString内容:Objective-C中==比较的是字符串对象的指针地址,要判断内容是否相等必须用isEqualToString:方法。 - 用
firstObject替代objectAtIndex:0:更安全,避免数组为空时崩溃(虽然preferredLanguages通常不会为空,但防御性编程更稳妥)。
内容的提问来源于stack exchange,提问作者Benjamin de Bos
相关产品推荐
相关产品推荐

