2013-12-07 9 views
10

Ho il seguente dizionario:ricevere elemento di raccolta di tipo int non è un oggetto Objective C in iOS

NSDictionary* jsonDict = @{ 
           @"firstName": txtFirstName.text, 
           @"lastName": txtLastName.text, 
           @"email": txtEmailAddress.text, 
           @"password": txtPassword.text, 
           @"imageUrl": imageUrl, 
           @"facebookId": [fbId integerValue], 
           }; 

Nel l'ultimo elemento, ho bisogno di usare un intero, ma sto ricevendo l'errore:

collection element of type int is not an objective c object 

Come posso utilizzare un valore int in questo elemento?

+0

'@" facebookId ": [fbId integerValue]' dovrebbe essere '@" facebookId ": @ ([fbId longLongValue])'. In Swift, tuttavia, non vi è alcun requisito per i numeri: cioè jsonDict = [..., "facebookId": fbId.longLongValue()] ' –

risposta

45

dovrebbe essere:

@"facebookId": [NSNumber numberWithInt:[fbId intValue]]; 

NSDictionary opere con solo e, di conseguenza, non siamo in grado di memorizzare semplicemente int s o integer s o bool s o di ogni altro primitive tipi di dati oggetti.

[fbId integerValue] restituisce un valore intero primitivo (che non è un oggetto)
quindi bisogna incapsulare primitive tipi di dati e trasformarli in oggetti. per questo motivo abbiamo bisogno di usare una classe come NSNumber per fare in modo che un oggetto memorizzi semplicemente questa merda. più

lettura http://rypress.com/tutorials/objective-c/data-types/nsnumber.html

5

OR, assumendo fbID è un NSString,

@"facebookId": @([fbId intValue]); 

suo come autoboxing in Java. @ converte qualsiasi numero primitivo in oggetto NSNumber.

+2

E se' fbId' è già un 'NSNumber', allora dovrebbe essere' @ "facebookId": fbId, 'Non è chiaro se si tratta di un' NSString' o 'NSNumber' poiché entrambi hanno il metodo' integerValue'. – rmaddy

0

NSDictionary può contenere solo oggetti (ad esempio NSString, NSNumber, NSArray, ecc.), Non valori primitivi (ad esempio int, float, double, ecc.). Lo stesso vale per quasi tutti gli incapsulamenti in Objective-C. Per memorizzare i numeri, utilizzare NSNumber:

NSDictionary *dictionary = @{@"key" : [NSNumber numberWithInt:integerValue]]}; 
-1

ho finito per usare un NSNumber:

NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
    [f setNumberStyle:NSNumberFormatterDecimalStyle]; 
    NSNumber * myNumber = [f numberFromString:fbId]; 
    [f release]; 
+0

Perché hai dovuto adottare un approccio così complesso per analizzare un BigInt come un ID di Facebook? È solo una stringa di caratteri a 64 bit integer/20. Si può semplicemente fare '[fbId longLongValue]' per analizzare la stringa in un numero primitivo e quindi '@ ([fbId longLongValue])' per lanciarla come 'NSNumber'. –

4

assumendo fbID è un int allora dovrebbe essere come:

@"facebookId": @(fbId)