在iOS应用程序中存储全局常量的位置?

JoJ*_*oJo 110 cocoa-touch global constants objective-c ios

我的iOS应用程序中的大多数模型都在查询Web服务器.我想有一个配置文件存储服务器的基本URL.它看起来像这样:

// production
// static NSString* const baseUrl = "http://website.com/"

// testing
static NSString* const baseUrl = "http://192.168.0.123/"
Run Code Online (Sandbox Code Playgroud)

通过注释掉一行或另一行,我可以立即更改模型指向的服务器.我的问题是,在iOS中存储全局常量的最佳实践是什么?在Android编程中,我们有这个内置的字符串资源文件.在任何Activity(相当于UIViewController)中,我们可以使用以下命令检索这些字符串常量:

String string = this.getString(R.string.someConstant);
Run Code Online (Sandbox Code Playgroud)

我想知道iOS SDK是否有类似的存储常量的地方.如果没有,Objective-C中的最佳做法是什么?

jus*_*tin 167

好吧,你想要它所涉及的接口的本地声明 - 应用程序范围的常量文件不是一件好事.

同样,最好简单地声明一个extern NSString* const符号,而不是使用#define:


SomeFile.h

extern NSString* const MONAppsBaseUrl;
Run Code Online (Sandbox Code Playgroud)

SomeFile.m

#import "SomeFile.h"

#ifdef DEBUG
NSString* const MONAppsBaseUrl = @"http://192.168.0.123/";
#else
NSString* const MONAppsBaseUrl = @"http://website.com/";
#endif
Run Code Online (Sandbox Code Playgroud)

除了省略C++兼容的Extern声明之外,这通常会在Apple的Obj-C框架中使用.

如果只需要一个文件或函数可以看到常量,那么static NSString* const baseUrl就可以了*.m.

  • 不确定为什么接受的答案有40票赞成#define - const确实更好. (26认同)

Cyr*_*lle 146

你也可以做一个

#define kBaseURL @"http://192.168.0.123/"
Run Code Online (Sandbox Code Playgroud)

在"常量"头文件中,比方说constants.h.然后做

#include "constants.h"
Run Code Online (Sandbox Code Playgroud)

在每个需要此常量的文件的顶部.

这样,您可以根据编译器标志在服务器之间切换,如下所示:

#ifdef DEBUG
    #define kBaseURL @"http://192.168.0.123/"
#else
    #define kBaseURL @"http://myproductionserver.com/"
#endif
Run Code Online (Sandbox Code Playgroud)

  • 在可能的情况下首选const over #define - 您可以获得更好的编译时检查,并且调试工作更好. (8认同)
  • 我遇到了这个解决方案的两个问题.首先,当我使用`#decalare`时,我收到一个编译错误,说"*无效的预处理指令声明*".所以我把它改成了`#define`.另一个问题是使用常量.我想用`static NSString*const fullUrl = [NSString stringWithFormat:@"%@%@",kbaseUrl,@"script.php"]`创建另一个常量,但显然用表达式创建consts是违法的.我得到错误"*初始化元素不是常数*". (2认同)
  • @AnsonYao通常当我遇到这种情况时,我忘了从#define中删除一个分号,例如`#define kBaseURL @"http://192.168.0.123/";` (2认同)

Pio*_*sik 39

我定义全局常量的方式:


AppConstants.h

extern NSString* const kAppBaseURL;
Run Code Online (Sandbox Code Playgroud)

AppConstants.m

#import "AppConstants.h"

#ifdef DEBUG
NSString* const kAppBaseURL = @"http://192.168.0.123/";
#else
NSString* const kAppBaseURL = @"http://website.com/";
#endif
Run Code Online (Sandbox Code Playgroud)

然后在你的{$ APP} -Prefix.pch文件中:

#ifdef __OBJC__
  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import "AppConstants.h"
#endif
Run Code Online (Sandbox Code Playgroud)

如果遇到任何问题,请首先确保将"预编译前缀标题"选项设置为"否".


Mar*_*chl 5

您还可以像这样连接字符串常量:

  #define kBaseURL @"http://myServer.com"
  #define kFullURL kBaseURL @"/api/request"
Run Code Online (Sandbox Code Playgroud)