【问题标题】:Type mismatch when comparing an NSUInteger to 0将 NSUInteger 与 0 进行比较时类型不匹配
【发布时间】:2013-09-02 17:52:37
【问题描述】:

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

我的对象定义:

@interface Item : NSObject

@property (nonatomic) NSUInteger n;

// stuff deleted...
@end

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

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

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

谢谢!

【问题讨论】:

  • 如果您包含类型不匹配错误的全文会有所帮助。
  • 你好像在取消iOS?对吗?

标签: objective-c


【解决方案1】:

原因是宏STAssertEquals使用strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2))来判断两个参数是否相同类型。如果不是,宏会引发异常,并显示消息“类型不匹配 --”...

所以你不能在兼容类型上使用STAssertEquals,它们必须完全匹配:

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

【讨论】:

    【解决方案2】:

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

    改用 (NSUinteger)0

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

    为了避免讨论 NSUInteger 是 unsigned log 还是 unsigned int...这是来自 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 并且在其他平台上可能会有所不同。

    【讨论】:

      【解决方案3】:

      你试过0uL吗? NSUInteger is unsigned long.

      【讨论】:

      • 在 iOS 上 NSUIntegerunsigned int
      • Apple 根据平台在条件内定义 NSUInteger,所以你们俩都是对的,这取决于平台。
      • @KennyTM 对。您链接中的讨论表明文档只是从 Mac OS 复制过来的(目前还没有 64 位 iOS)。提交错误。
      • 查看我对 NSUinteger 的回答
      猜你喜欢
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-08-14
      • 1970-01-01
      • 2015-01-31
      • 2019-05-28
      • 2020-08-13
      相关资源
      最近更新 更多