【问题标题】:Assigning one NSString constant to another将一个 NSString 常量分配给另一个
【发布时间】:2014-09-10 19:05:48
【问题描述】:

我想定义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 将自动获取新值(与所有常量一样)。
  • 将所有常量放在一个文件的同一位置。

【问题讨论】:

  • “我可以测试相等性,而无需调用 isEqual 方法。”不要指望它总是适用于火柴盒。此外,这是一个过早的优化。
  • @Zaph:这只是作为示例提供的,我不打算实际这样做。您是否有指向某个网站的链接,该链接描述了为什么它可能并不总是有效?

标签: ios objective-c nsstring constants


【解决方案1】:

我认为你需要退后一步考虑一下是否需要将字符串定义为 const。

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

如果字符串作为属性驻留在类中,您可以将其设为只读属性 - 即访问器方法但没有设置器方法。然后,您可以在内部根据需要在类中构造字符串,同时防止调用者更改值。

【讨论】:

  • 我只设置了一次值,而这正是定义变量的同时。此外,我分配给它的值是我希望成为常量的值(因此我在其他字符串中使用了const)。这应该是常量的有效用法,因为如果我对 NSIntegers 做同样的事情,例如,编译器不会抱怨。
【解决方案2】:

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

您可以在函数中使用此方法,而不是在外部,也许它可以与 C++ 或 Objective-C++ 一起使用(C++ 标准对此更加灵活)

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

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

然后,在其他地方,你可以得到你想要的 var:

extern NSString *kUrlGoogle;

【讨论】:

    【解决方案3】:

    你有几个选择。

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多