在我的 iOS 应用程序中,我有两个目标及其自己的 .plist 文件:Production 和 Test。
我的应用程序使用了一堆不同的 URL,这些 URL 位于生产服务器或测试服务器上。因此,我在我的两个 plist 中添加了一个新 key ,如下所示:
<!-- MyAppTest-Info.plist -->
...
<key>MAServerURL</key>
<string>http://test.myap.com</string>
...
<!-- MyApp-Info.plist -->
...
<key>MAServerURL</key>
<string>http://myapp.com</string>
...
所以现在在我的 Const.h 中而不是定义特定的 urls #define IMAGEURL @"http://myapp.com/images/"
并在我想切换环境时更改它们
我现在可以这样做了:
// Const.h
#define SERVER_URL [[[NSBundle mainBundle] infoDictionary] objectForKey:@"MAServerURL"];
#define IMAGE_URL [NSString stringWithFormat:@"%@/images", SERVER_URL];
#define AUDIO_URL [NSString stringWithFormat:@"%@/audio", SERVER_URL];
#define FEEDBACK_URL [NSString stringWithFormat:@"%@/mail/feedback", SERVER_URL];
....
理论上这是可行的,但对于常量的每次访问,包都会被访问,并且在语法上它也不是真正的美(由于 OBJ-C 中的冗长连接)。
非常欢迎任何想法和建议。
最佳答案
extern
是你的 friend ...尝试了解它。
基本上,您在头文件中声明一个全局变量,使用 extern
修饰符,基本上意味着它的值稍后将在另一个源文件中定义。
所以你可以:
const.h
extern NSString * kAudioURL;
这只是将变量声明为 NSString 对象。
包括您的 const.h
文件在内的所有文件都将能够看到此变量,即使它实际上并未定义。
然后,您将在另一个(实现)文件中定义该变量。
const.m
NSString * kAudioURL = @"foo";
这样,定义将被隐藏,就像它发生在实现文件中一样,但其他文件将通过包含头文件来访问您的变量。
这样您就可以一次分配正确的值。
当然,在您的示例中,您使用的是计算值。由于 kAudioURL
是全局的,您将无法编写:
NSString * kAudioURL = [ NSString stringWithFormat: @"%@/images", SERVER_URL ];
但是您可以将初始值设置为 nil,并使用初始化函数,该函数可能会从您的应用程序的委托(delegate)中调用。
关于objective-c - 将#define 与 [NSBundle mainBundle] 中的键组合的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7531580/