我正在为具有NSUInteger属性的对象编写单元测试,当我与0比较时,我得到的类型不匹配。有人可以解释原因吗?
我的对象定义:
@interface Item : NSObject
@property (nonatomic) NSUInteger n;
// stuff deleted...
@end
我的单元测试中出现类型不匹配错误的行:
STAssertEquals(0, i.n, @"n property should be zero");
我也试过0L,我也遇到了类型不匹配的问题。我通过声明一个名为“零”的NSUInteger变量并将其设置为0来解决这个问题,然后将其用于比较,但我想更好地理解这里发生了什么。
谢谢!
答案 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