我有一个枚举属性:
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
在运行时没有问题 - 现在。但我想成为犹太教徒。有什么建议吗?
答案 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
。