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

时间:2014-07-19 22:01:45

标签: ios objective-c nsstring constants

我想定义NSString常量,并让其中一个引用另一个。例如:

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

NSString * const kUrlDefault = kUrlGoogle;

当我尝试这样做时,我在kUrlDefault行上收到编译时错误:

  

Initializer元素不是编译时常量

有没有办法在不使用宏的情况下将kUrlDefault分配给上面的其中一个字符串?

以下是一些有用的原因:

  • 我可以测试相等性而无需调用isEqual方法。
  • 如果我更新常量,kUrlDefault将自动获取新值(与所有常量一样)。
  • 将所有常量保存在同一位置的一个文件中。

3 个答案:

答案 0 :(得分:1)

我认为您需要退一步思考是否需要将字符串定义为const。

显然,字符串不是常量,因为您正在尝试为其分配新值 - 这是不可能的,因为您特别指示编译器确保使用const关键字不会更改该值。 / p>

如果字符串作为类中的属性存在,则可以使其成为只读属性 - 即访问器方法,但不使用setter方法。然后,您可以在内部构建字符串,同时保持调用者不更改值。

答案 1 :(得分:0)

你有几个选择。

1)在班级的kUrlDefault方法中设置+ (void)initialize。这有一个主要的缺点。在使用常量之前,需要以某种方式引用类。否则,常量将不会被初始化。

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

答案 2 :(得分:0)

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

你可以在一个函数中使用这个方法,而不是在外面,也许它可以用C ++或Objective-C ++(C ++标准更灵活)

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

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

以后,在其他地方,您可以获得所需的var:

extern NSString *kUrlGoogle;