0

NSUInteger プロパティを持つオブジェクトの単体テストを作成していますが、0 と比較すると型の不一致が発生します。誰かが理由を説明できますか?

私のオブジェクト定義:

@interface Item : NSObject

@property (nonatomic) NSUInteger n;

// stuff deleted...
@end

そして、型の不一致エラーを取得する単体テストの行:

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

0L も試しましたが、それと型の不一致も発生します。「ゼロ」と呼ばれるNSUInteger変数を宣言して0に設定し、それを比較に使用することでこれを回避しましたが、ここで何が起こっているのかをよりよく理解したいと思います.

ありがとう!

4

3 に答える 3

3

これは、2 つのパラメーターが同じ型であるかどうかを決定するためにマクロSTAssertEqualsが使用されるためです。strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2))そうでない場合、マクロは「型の不一致 --」というメッセージで例外を発生させます。

したがって、互換性のあるタイプでは使用できませんSTAssertEquals。正確に一致する必要があります。

STAssertEquals((NSUInteger)0, i.n, @"n property should be zero");
于 2013-09-02T18:12:13.327 に答える
0

リテラル 0 を NSUInteger ではなく int として受け取ります。

代わりに使用 (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 であり、他のプラットフォームでは異なる場合があります。

于 2013-09-02T18:05:05.320 に答える
-1

試しました0uLか?NSUInteger はunsigned long.

于 2013-09-02T17:57:45.863 に答える