将NSUInteger与0进行比较时,类型不匹配

时间:2013-09-02 17:52:37

标签: objective-c

我正在为具有NSUInteger属性的对象编写单元测试,当我与0比较时,我得到的类型不匹配。有人可以解释原因吗?

我的对象定义:

@interface Item : NSObject

@property (nonatomic) NSUInteger n;

// stuff deleted...
@end

我的单元测试中出现类型不匹配错误的行:

STAssertEquals(0, i.n, @"n property should be zero");

我也试过0L,我也遇到了类型不匹配的问题。我通过声明一个名为“零”的NSUInteger变量并将其设置为0来解决这个问题,然后将其用于比较,但我想更好地理解这里发生了什么。

谢谢!

3 个答案:

答案 0 :(得分:3)

原因是宏STAssertEquals使用strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2))来决定这两个参数是否具有相同的类型。如果没有,宏会引发一个异常,消息“Type mismatch - ”...

因此,您无法在兼容类型上使用STAssertEquals,它们必须完全匹配:

STAssertEquals((NSUInteger)0, i.n, @"n property should be zero");

答案 1 :(得分:0)

它将文字0作为int而不是NSUInteger。

改为使用(NSUinteger)0

STAssertEquals((NSUInteger)0, i.n, @"n property should be zero");

为了避免讨论NSUInteger是无符号日志还是无符号整数...这来自Apple NSObjCRuntime.h:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

因此在iOS中是unsigned int,在其他平台上可能会有所不同。

答案 2 :(得分:-1)

你试过0uL吗? NSUInteger is unsigned long