我正在使用SpriteKit
制作(某种)交易卡游戏。我创建了一个Card类,每张卡都有一个等级:
// in Card.h
@property NSInteger cardRank;
在我的另一个课程(游戏课程)中,我试图检索此值。我创建一个Card实例,并在控制台中显示该值(测试目的):
Card *tmpCard = [[Card alloc] init];
NSLog(@"%@", tmpCard.cardRank);
当我在NSLog中使用%@时,我获得了cardRank的正确值,但是Xcode警告说" nsinteger类型的值不应该用作格式参数& #34;并且我应该选择" long"。
如果我施展得很久......:
NSLog(@"%ld", (long)tmpCard.cardRank);
...我没有错误,但没有正确的cardRank值(它显示类似" 140378469207968")。
有人可以解释我为什么会得到这个结果吗?
我可能犯了一个新手的错误,但在几天内我自己也无法理解。
答案 0 :(得分:2)
获取一本关于C语言的好书,并查看格式字符串。 Objective-C中的格式字符串完全相同,除了期望对象的%@。
打印NSInteger和NSUInteger的正确方法是%zd(在32位和64位上工作正常)。无论如何,如果您在Xcode中打开警告(如您所愿)并且如果您在Xcode中将警告转换为错误(如您所愿),编译器将告诉您错误的位置,甚至提出如何修复它的建议。
顺便说一句。如果您使用%@打印NSInteger,我预计会崩溃。你的帖子似乎没有包含真相。如果您有疑问,请非常,非常准确地报告您正在做的事情。 '它显示类似“140378469207968”的东西是没用的。完全显示 显示的内容。
答案 1 :(得分:2)
使用%d记录int
使用%zd
记录NSInteger使用%tu
记录NSUInteger答案 2 :(得分:0)
您可以找到String Format Specifiers on Apple doc。
顺便说一下,NSLog(@"%ld", (long)tmpCard.valeurTop);
肯定不会向你展示“cardRank的正确值”,因为你要求valeurTop ......
答案 3 :(得分:0)
%d
格式说明符用于NSInteger
类型值,但由于iOS支持32& 64位,64位NSInteger
属于long
类型,可以使用%ld
格式说明符打印。
对于引用,%@
用于NSString值。
顺便说一句,你正在打印错误的变量,因此它会打印垃圾值。