Come si incrementa un NSNumber?
cioè myNSNumber ++
Come si incrementa un NSNumber?
cioè myNSNumber ++
Risposte:
Aggiornamento: Cordiali saluti, personalmente mi piacciono di più le risposte di una riga di BoltClock e DarkDusts. Sono più concisi e non richiedono variabili aggiuntive.
Per incrementare un NSNumber, dovrai ottenere il suo valore, incrementarlo e memorizzarlo in un nuovo NSNumber.
Ad esempio, per NSNumbertenere un numero intero:
NSNumber *number = [NSNumber numberWithInt:...];
int value = [number intValue];
number = [NSNumber numberWithInt:value + 1];
O per un NSNumbernumero in virgola mobile:
NSNumber *number = [NSNumber numberWithDouble:...];
double value = [number doubleValue];
number = [NSNumber numberWithDouble:value + 1.0];
...? Questo è un riferimento pseudo-codice, giusto? XCode no...
...è solo un segnaposto per qualsiasi numero tu voglia.
NSNumbergli oggetti sono immutabili; il meglio che puoi fare è prendere il valore primitivo, incrementarlo e quindi racchiudere il risultato nel suo NSNumberoggetto:
NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1];
Per chiunque stia utilizzando l'ultima versione di Xcode (scrivendo questa a partire dalla 4.4.1, SDK 5.1), con l'uso di letterali oggetto, è possibile ripulire il codice anche un po 'di più ...
NSNumber *x = @(1);
x = @([x intValue] + 1);
// x = 2
È ancora un po 'un dolore affrontare la boxe e unboxing di tutto per fare semplici operazioni, ma sta migliorando, o almeno più breve.
Mettili tutti insieme e avrai:
myNSNumber = @(myNSNumber.intValue + 1);
NSNumberoggetti sono immutabili (?)
Mi piace l'espressione del punto perché è più concisa ed è per questo che IOS la supporta in primo luogo:
myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];
Se lo stai usando per memorizzare un valore integrale:
myNSNumber = @(myNSNumber.longLongValue + 1);
Per le cose in virgola mobile la risposta breve è la seguente, ma è una cattiva idea farlo, perderai la precisione e se farai qualche tipo di confronto in seguito come [myNSNumber isEqual: @ (4.5)] potresti essere sorpreso :
myNSNumber = @(myNSNumber.floatValue + 1);
Se hai bisogno di fare calcoli su numeri in virgola mobile rappresentati come oggetti in Objective-C (cioè se hai bisogno di metterli in array, dizionari, ecc.) Dovresti usare NSDecimalNumber.
Usa una categoria per facilitarne l'uso futuro. Ecco un'idea di base.
- (void)incrementIntBy:(int)ammount {
self = [NSNumber numberWithInt:(self.intValue + ammount)];
}
Molte buone informazioni nelle risposte a questa domanda. Ho usato la risposta selezionata nel mio codice e ha funzionato. Poi ho iniziato a leggere il resto dei post e ho semplificato molto il codice. È un po 'più difficile da leggere se non hai familiarità con i cambiamenti nella notazione introdotti in Xcode 5, ma è molto più pulito. Probabilmente potrei fare solo una riga, ma poi è un po 'troppo difficile capire cosa sto facendo.
Sto memorizzando un NSNumber in un dizionario e voglio incrementarlo. Lo ottengo, lo converto in un int, lo incremento mentre lo converto in un NSNumber, quindi lo rimetto nel dizionario.
Vecchio codice
NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
int correctValue = [correct intValue];
correct = [NSNumber numberWithInt:correctValue + 1];
[scoringDictionary removeObjectForKey:@"correct"];
scoringDictionary[@"correct"] = correct;
Nuovo codice
NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
scoringDictionary[@"correct"] = @(correct.intValue + 1);
NSNumber *, controlla sempre se i tipi primitivi saranno sufficienti.