stringWithFormat中的枚举引发不兼容的指针类型警告

时间:2013-04-20 15:44:10

标签: objective-c cocoa enums stringwithformat

我有一个枚举属性:

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

...并收到此警告:

  

传递来自不兼容指针类型的localizedStringForKey: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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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]];

这将使编译器满意。

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