将一个NSString常量分配给另一个常量

4
我希望定义NSString常量,并使其中一个引用另一个。例如:
NSString * const kUrlGoogle = @"http://google.com";
NSString * const kUrlApple = @"http://apple.com";
NSString * const kUrlMicrosoft = @"http://microsoft.com";

NSString * const kUrlDefault = kUrlGoogle;

当我尝试这样做时,kUrlDefault行会出现编译时错误:

初始化元素不是编译时常量

有没有办法将kUrlDefault分配给上述字符串之一,而不使用宏?
以下是为什么这可能有用的几个原因:
  • 我可以在不调用isEqual方法的情况下测试相等性。
  • 如果更新常量,kUrlDefault将自动获得新值(与所有常量一样)。
  • 将所有常量保持在同一文件中的同一位置。

我可以在不调用isEqual方法的情况下测试相等性。但是不能保证在匹配情况下始终有效。此外,这是一种过早的优化。 - zaph
@Zaph:这只是一个例子,我并不打算真的这么做。你有没有一个网站链接可以解释为什么它可能并不总是有效? - Senseful
3个回答

1
我认为你需要退后一步,思考字符串是否需要被定义为常量。
显然,该字符串不是常量,因为您试图将一个新值赋给它 - 这是不可能的,因为您明确指示编译器使用const关键字确保该值不会被更改。
如果该字符串作为类中的属性存在,则可以将其设置为只读属性 - 即访问器方法但没有setter方法。这样,您就可以在类内部按照自己的意愿构建字符串,同时防止调用者更改该值。

我只设置了一次值,而且这恰好是在定义变量的同时。此外,我分配给它的值是我希望成为常量的值(因此我在其他字符串中使用了 const)。这应该是常量的有效用法,因为如果我对 NSInteger 做同样的事情,编译器不会抱怨。 - Senseful

0

你有几个选项。

1)在类的+(void)initialize方法中设置kUrlDefault。但是这种方法有一个主要缺点。它需要在使用该常量之前以某种方式引用该类。否则,该常量尚未初始化。

2)将kUrlDefault常量重构为类方法。该方法的实现将返回所需的默认值。这种方法的一个优点是,它将全局变量添加到类级别而不是应用程序级别常量中,从而增加了范围。


0

在任何函数之外设置的常量不能是动态的。

你可以在函数内使用这种方法,但不要在函数之外使用。也许它可以与C++或Objective-C++一起使用(C++标准更加灵活)

我会使用这个解决方案(我不知道这个方法是否适合你的需求):

NSString *kUrlGoogle = @"http://google.com";
NSString *kUrlApple = @"http://apple.com";
NSString *kUrlMicrosoft = @"http://microsoft.com";

然后,在其他地方,您可以使用以下代码获取所需的变量:

extern NSString *kUrlGoogle;

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