字符串是否定义为常量而不是NSStrings?

时间:2011-09-03 14:52:56

标签: objective-c

我有一个常量定义为:

#define BEGIN_IMPORT_STRING @"Importing Hands!";

但是当我尝试连接时出现错误:

NSString *updateStr = [NSString stringWithFormat:@"%@%@", BEGIN_IMPORT_STRING, @" - Reading "];

如果我用字符串文字

替换它,就不会发生这种情况
NSString *updateStr = [NSString stringWithFormat:@"%@%@", @"foo", @" - Reading "];

或本地字符串

NSString *temp = @"foo";
NSString *updateStr = [NSString stringWithFormat:@"%@%@", temp, @" - Reading "];

4 个答案:

答案 0 :(得分:4)

替换

#define BEGIN_IMPORT_STRING @"Importing Hands!";

#define BEGIN_IMPORT_STRING @"Importing Hands!"

这是因为您的案例中的编译器会将所有BEGIN_IMPORT_STRING替换为@"Importing Hands!";

答案 1 :(得分:4)

您需要从#define

中删除分号
#define BEGIN_IMPORT_STRING @"Importing Hands!"

对于编译器,结果行如下所示:

NSString *updateStr = [NSString stringWithFormat:@"Importing Hands!";, @" - Reading "];

答案 2 :(得分:2)

除了接受的答案(删除分号),请注意:

  • @"Foo" NSString。你甚至可以给它发一条消息。
  • #define FOO @"Foo"是预处理器宏,而不是常量。这是打字快捷方式。

虽然宏不是一种不常见的方法来避免重新输入相同的字符串,但它们是一个不幸的保留。从本质上讲,他们正在玩不再需要的游戏。

对于重复的字符串,我更喜欢:

static NSString *const Foo = @"Foo;

此定义的const部分确保指针被锁定,因此Foo不能指向不同的对象。

static部分将范围限制为文件。如果要从其他文件访问它,请删除static并将以下声明添加到头文件中:

extern NSString *const Foo;

答案 3 :(得分:1)

你应该使用

   NSLocalizedString(@"Importing Hands!", @"Message shown when importing of hands starts");  

我把它作为一个答案,因为这看起来像你不想去的东西,并重做你所有的代码。