如何在Obj-C中通过连接字符串创建常量NSString?

18

我正在尝试通过连接其他NSString实例来创建一个常量NSString实例。

以下是我的实现文件中的代码:

static NSString *const MY_CONST = @"TEST";
static NSString *const MY_CONCATENATE_CONST = [NSString stringWithFormat:@"STRING %@", MY_CONST];

这会导致以下编译错误:初始化元素不是常量。

我想这是因为stringWithFormat不返回常量NSString,但由于在Obj-C中没有其他方法可以连接字符串,那我该怎么办呢?

感谢您的帮助,

Eric。

3个回答

51

我曾经以为一定有方法可以做到这一点,但我所能做的最好的方式只是使用#define指令。例如:

// Define the base url as an NSString
#define BASE_URL @"http://www.milhouse.co.uk/"

// Now the derived strings glued by magic
NSString *const kBaseURL    = BASE_URL;
NSString *const kStatusURL  = BASE_URL @"status.html";
NSString *const kBalanceURL = BASE_URL @"balance.html";

我遇到了“重复符号_kActivityLogURL”错误。 - Kirit Vaghela

4

静态常量对象的值在编译时确定,因此您确实无法添加任何方法调用到它们的初始化中。作为替代方案,您可以采取以下措施:

static NSString *const MY_CONST = @"TEST";
static NSString *MY_CONCATENATE_CONST = nil;

if (nil == MY_CONCATENATE_CONST)
   MY_CONCATENATE_CONST = [NSString stringWithFormat:@"STRING %@", MY_CONST];

1

我认为你需要退一步,思考一下是否需要将字符串定义为常量。

显然,该字符串不是常量,因为您试图为其分配一个新值 - 这是不可能的,因为您使用const关键字明确指示编译器确保该值不会更改。

如果该字符串作为类中的属性存在,则可以将其设置为只读属性 - 即访问器方法但没有setter方法。这样,您就可以在类内部按照自己的意愿构造字符串,同时防止调用者更改该值。


10
我同意这个观点,但如果我需要通过连接其他常量来定义一个常量(一个实际上永远不会改变的常量),该怎么办?在Java中,这很简单: private static final String CONST1 = "CONST1"; private static final String CONST2 = "CONST2"; private static final String CONCAT = CONST1 + " " + CONST2;这使我可以拥有3个常量,第三个是前两个的连接。 - Eric MORAND

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接