2010-06-17 55 views
17

我想通过concatanating其他NSString实例instanciate常量NSString。如何通过连接Obj-C中的字符串来创建常量NSString?

以下是我在实现文件正在做:

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

这导致以下编译错误:初始化器元素是不恒定

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

感谢您的帮助,

Eric。

回答

1

显然,字符串不是一个常量,因为您正在尝试为它指定一个新值 - 而且这是不可能的,因为您特别指示编译器确保该值不会被使用const关键字更改。

如果字符串作为属性存放在类中,您可以将其设置为只读属性 - 即访问方法但不设置方法。然后,您可以根据需要在课程内部构建您的字符串,同时保持呼叫者不更改值。

+10

我同意这一点,但是如果我需要通过连接其他常量来定义一个常量(一个实际的,永远不会改变)呢? 在Java中,这是微不足道的: private static final String CONST1 =“CONST1”; private static final String CONST2 =“CONST2”; private static final String CONCAT = CONST1 +“”+ CONST2; 这让我有3个常量,第三个是其他两个的连接。 – 2010-06-17 09:12:47

3

静态常量对象值是在编译时确定的,所以你确实不能在它们的初始化中添加任何方法调用。作为替代,你可以执行以下操作:我想你需要退一步想想,如果字符串需要被定义为常量

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

我认为必须有办法做到这一点,但我可以做的最好的方法是使用#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"; 
+0

我收到'duplicate symbol _kActivityLogURL'错误 – 2014-04-05 12:44:08