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

时间:2010-06-17 08:44:03

标签: objective-c

我试图通过连接其他NSString实例来实现常量NSString。

以下是我在实施文件中所做的事情:

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

导致以下编译错误:Initializer元素不是常量

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

感谢您的帮助,

埃里克。

3 个答案:

答案 0 :(得分:48)

我认为必须有办法做到这一点,但我能做的最好的事情就是使用#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";

答案 1 :(得分:3)

静态const对象值是在编译时确定的,因此您确实无法向其初始化添加任何方法调用。作为替代方案,您可以执行以下操作:

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];

答案 2 :(得分:1)

我认为您需要退一步思考如果字符串需要定义为const。

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

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