2013-09-02 4 views
0

Я пишу модульный тест для объекта, который имеет свойство NSUInteger, и я получаю несоответствие типа при сравнении с 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, а затем используя ее для сравнения, но я хотел бы лучше понять, что здесь происходит.

Спасибо!

+0

Это поможет, если вам включал полный текст ошибки несоответствия типа. –

+0

Кажется, что вы не знаете iOS? Правильно? –

ответ

3

Причина этого заключается в том, что макрос STAssertEquals использует strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)), чтобы решить, имеют ли два параметра один и тот же тип. Если нет, то макрос вызывает исключение с сообщением «Тип рассогласования -» ...

Таким образом, вы не можете использовать STAssertEquals совместимых типов, они должны точно соответствовать:

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

Вы пробовали 0uL? NSUInteger is unsigned long.

+0

На iOS 'NSUInteger'' 'unsigned int'. –

+0

@NikolaiRuhe: Если это так, документация Apple неверна :( – kennytm

+0

Apple определяет NSUInteger внутри условного в зависимости от платформы, поэтому вы оба правы, это зависит от платформы. –

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 

Так в Иос unsigned int и на других платформах могут различаться.

Смежные вопросы