#objective-c #ios
#objective-c #iOS
Вопрос:
Я столкнулся со своеобразной проблемой в программе для iPhone. Это мой код —
В viewDidLoad моего контроллера представления я создаю массив
grades = [[NSArray arrayWithObjects:@"Grade 1", @"Grade 2", @"Grade 3", nil] retain];
Теперь у меня есть свойство
@property (nonatomic) NSInteger selectedGradeIndex;
И я написал следующий метод установки
- (void) setSelectedGradeIndex:(NSInteger)newValue
{
if(newValue >= [grades count])
{
NSLog(@"newValue = %d >= [grades count] = %d",newValue, [grades count]);
newValue = 0;
}
else if(newValue < 0)
{
NSLog(@"newValue = %d < 0",newValue);
newValue = [grades count] - 1;
}
selectedGradeIndex = newValue;
lblGrade.text= [grades objectAtIndex:selectedGradeIndex];
}
Где-то в коде у меня есть
self.selectedGradeIndex = -1;
Журнал внутри установщика показывает
newValue = -1 >= [grades count] = 6
Я в замешательстве. Почему элемент управления будет входить в первое условие if, когда журнал ясно показывает, что условие ложно.
Я изменил установщик на
- (void) setSelectedGradeIndex:(NSInteger)newValue
{
int count = [grades count];
if(newValue >= count)
{
NSLog(@"newValue = %d >= count = %d",newValue, count);
newValue = 0;
}
else if(newValue < 0)
{
NSLog(@"newValue = %d < 0",newValue);
newValue = count - 1;
}
selectedGradeIndex = newValue;
lblGrade.text= [grades objectAtIndex:selectedGradeIndex];
}
И теперь все работает так, как ожидалось. Журнал
newValue = -1 < 0
Может кто-нибудь сказать мне, почему предыдущий метод не работает?
Ответ №1:
Когда вы сравниваете signed int (вашу переменную) с unsigned int (тип -[NSArray count]
, подписанный int повышается до unsigned . Число -1
преобразуется в чрезвычайно большое значение без знака int . Таким образом, -1 > 6
.