1

我有一个枚举属性:

typedef enum syncCodeTypes {
    kCodeNull, 
    kCodeFoo,
    kCodeBar,
    kCodeDone
} syncCodeType;

//...

@property syncCodeType syncCode;

我在一个stringWithFormat:

[self showAlertWithMessage:NSLocalizedString(@"Sync Error", @"Sync Error") andInfo:[NSString stringWithFormat:NSLocalizedString("Heads up re foobar code %d.", "Heads up re foobar code %d."), self.syncCode]];

…并得到这个警告:

从不兼容的指针类型传递本地化StringForKey:value:table 的参数 1。

%u如果我替换无符号转换说明符(而不是) ,也会发生同样的事情%d。编译器不喜欢%lu, %ld,%llu%lld任何一个。

有关相关语言的其他帖子建议枚举既不是有符号也不是无符号的,所以我尝试将枚举显式转换为有符号整数和无符号整数 - 并得到完全相同的错误消息:

NSInteger iSyncCode = self.syncCode;
[self showAlertWithMessage:NSLocalizedString(@"Sync Error", @"Sync Error") andInfo:[NSString stringWithFormat:NSLocalizedString(“Heads up re foobar code %d.", “Heads up re foobar code %d."), iSyncCode]];
// compiler still annoyed

NSUInteger uSyncCode = self.syncCode;
[self showAlertWithMessage:NSLocalizedString(@"Sync Error", @"Sync Error") andInfo:[NSString stringWithFormat:NSLocalizedString(“Heads up re foobar code %u.”, “Heads up re foobar code %u.”), uSyncCode]];
// compiler still annoyed

在运行时没有问题——现在。但我想成为犹太教徒。有什么建议么?

4

2 回答 2

3

您忘记了 中@的字符串之前的 - 符号NSLocalizedString

替换"Heads up re foobar code %d."@"Heads up re foobar code %d."

于 2013-04-20T15:50:14.243 回答
1

格式说明%d符用于int变量。但self.syncCode不是一个int,它是一个syncCodeType

您需要将值转换为int

(int)self.syncCode

或整行:

[self showAlertWithMessage:NSLocalizedString(@"Sync Error", @"Sync Error") andInfo:[NSString stringWithFormat:NSLocalizedString(@"Heads up re foobar code %d.", @"Heads up re foobar code %d."), (int)self.syncCode]];

这将使编译器高兴。

PS 正如 phix23 指出的那样,您需要将NSString文字而不是 C 字符串文字传递给NSLocalizedString.

于 2013-04-20T15:51:16.303 回答