Como faço para incrementar um NSNumber?
ou seja, myNSNumber ++
Como faço para incrementar um NSNumber?
ou seja, myNSNumber ++
Respostas:
Atualização: Para sua informação, eu pessoalmente gosto mais das respostas de uma linha do BoltClock e do DarkDusts. Eles são mais concisos e não requerem variáveis adicionais.
Para incrementar um NSNumber, você terá que obter seu valor, incrementá-lo e armazená-lo em um novo NSNumber.
Por exemplo, para NSNumbersegurar um inteiro:
NSNumber *number = [NSNumber numberWithInt:...];
int value = [number intValue];
number = [NSNumber numberWithInt:value + 1];
Ou para NSNumbersegurar um número de ponto flutuante:
NSNumber *number = [NSNumber numberWithDouble:...];
double value = [number doubleValue];
number = [NSNumber numberWithDouble:value + 1.0];
...significa? Isso é uma referência de pseudo-código, certo? XCode não...
...é apenas um espaço reservado para qualquer número que você quiser.
Para quem está usando a versão mais recente do Xcode (escrevendo a partir de 4.4.1, SDK 5.1), com o uso de literais de objeto, você pode limpar o código um pouco mais ...
NSNumber *x = @(1);
x = @([x intValue] + 1);
// x = 2
Ainda é meio chato lidar com o encaixotamento e desembalagem de tudo para fazer operações simples, mas está ficando melhor, ou pelo menos mais curto.
Junte todos eles e você terá:
myNSNumber = @(myNSNumber.intValue + 1);
NSNumberobjetos são imutáveis (?)
Eu gosto da expressão de ponto porque é mais concisa e é por isso que o IOS oferece suporte em primeiro lugar:
myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];
Se você estiver usando para armazenar um valor integral:
myNSNumber = @(myNSNumber.longLongValue + 1);
Para coisas de ponto flutuante, a resposta curta é a seguinte, mas é uma má ideia fazer isso, você perderá a precisão e se fizer qualquer tipo de comparação mais tarde, como [myNSNumber isEqual: @ (4.5)], você pode se surpreender :
myNSNumber = @(myNSNumber.floatValue + 1);
Se você precisar fazer matemática em números de ponto flutuante representados como objetos em Objective-C (ou seja, se precisar colocá-los em matrizes, dicionários, etc.), você deve usar NSDecimalNumber.
Use uma categoria para facilitar o uso futuro. Aqui está uma ideia básica.
- (void)incrementIntBy:(int)ammount {
self = [NSNumber numberWithInt:(self.intValue + ammount)];
}
Muita informação boa nas respostas a esta pergunta. Usei a resposta selecionada no meu código e funcionou. Então comecei a ler o resto dos posts e simplifiquei muito o código. É um pouco mais difícil de ler se você não está familiarizado com as mudanças na notação que foram introduzidas no Xcode 5, mas é muito mais limpo. Eu provavelmente poderia fazer apenas uma linha, mas é um pouco difícil descobrir o que estou fazendo.
Estou armazenando um NSNumber em um dicionário e desejo incrementá-lo. Eu pego, converto em um int, incremento ao convertê-lo em um NSNumber e coloco de volta no dicionário.
Código Antigo
NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
int correctValue = [correct intValue];
correct = [NSNumber numberWithInt:correctValue + 1];
[scoringDictionary removeObjectForKey:@"correct"];
scoringDictionary[@"correct"] = correct;
Novo Código
NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
scoringDictionary[@"correct"] = @(correct.intValue + 1);
NSNumber *, sempre verifique se os tipos primitivos são suficientes.