Создание NSString внутри if-case терпит неудачу? - PullRequest
0 голосов
/ 15 апреля 2011

Я просто пытаюсь решить, с каким текстом я собираюсь, простым if-способом.Почему X-код жалуется и не позволяет мне строить проект, говоря, что переменная не определена, если она четко определена в if?

 if(indexPath.row == [listOfItems count]) {
            NSString *cellValue = [[NSString alloc] initWithFormat:@"Totalt: %@st registrerade", companyTotalReg]; //cellValue is unused
        } else {
            NSString *cellValue = [[NSString alloc] initWithFormat:@"Totalt: SEK%@ intjänat", companyTotalPay]; //cellValue is unused
        }
        cell.textLabel.text = cellValue; //cellValue is undefined

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Вам нужно сделать это следующим образом:

NSString *cellValue = nil;
if(indexPath.row == [listOfItems count]) {
    cellValue = [[NSString alloc] initWithFormat:@"Totalt: %@st registrerade", companyTotalReg]; //cellValue is unused
} else {
    cellValue = [[NSString alloc] initWithFormat:@"Totalt: SEK%@ intjänat", companyTotalPay]; //cellValue is unused
}
cell.textLabel.text = cellValue; //cellValue is not undefined anymore

В противном случае может случиться так, что теоретически оба ваших предложения if не будут выполнены (даже если это невозможно в вашем случае), а cellValue останется необъявленным. Поскольку компилятор не может знать, теоретически возможно ли сбить все ваши условия, он все равно просто предупредит вас.

Как правило, вы должны / должны всегда инициализировать переменные в области действия , в которой они собираются использоваться . В вашем случае cellValue будет выходить за рамки для cell.textLabel.text = cellValue;.

Вроде не по теме, но вы должны также использовать NSLocalizedString() для любой строки пользовательского интерфейса, вместо жестко закодированных.

1 голос
/ 15 апреля 2011
 NSString *cellValue = NULL; 

if(indexPath.row == [listOfItems count]) {
    cellValue = [[NSString alloc] initWithFormat:@"Totalt: %@st registrerade", companyTotalReg]; //cellValue is unused
} else {
    cellValue = [[NSString alloc] initWithFormat:@"Totalt: SEK%@ intjänat", companyTotalPay]; //cellValue is unused
}
cell.textLabel.text = [cellValue autorelease]; // The autorelease is here because you are leaking the memory otherwise. If you release the string later anyway, you can and should remove it!
0 голосов
/ 15 апреля 2011

То, как вы это сделали, определяет две строки NSS с именами cellValue.Время жизни первого cellValue ограничено областью действия предложения if, а время жизни второго cellValue ограничено областью действия предложения else.Вы можете решить это двумя способами:

NSString *cellValue;
if (indexPath.row == [listOfItems count])
    cellValue = [[NSString alloc] initWithFormat:@"Totalt: %@st registrerade", companyTotalReg];
else
    cellValue = [[NSString alloc] initWithFormat:@"Totalt: SEK%@ intjänat", companyTotalPay]; 
cell.textLabel.text = cellValue;

или

NSString *cellValue = (indexPath.row == [listOfItems count])
    ? [[NSString alloc] initWithFormat:@"Totalt: %@st registrerade", companyTotalReg]
    : [[NSString alloc] initWithFormat:@"Totalt: SEK%@ intjänat", companyTotalPay];
cell.textLabel.text = cellValue;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...