ObjectiveC Parse Integer da String


119

Sto cercando di estrarre una stringa (che contiene un numero intero) da un array e quindi di usarlo come int in una funzione. Sto cercando di convertirlo in un int usando intValue.

Ecco il codice che ho provato.

  NSArray *_returnedArguments = [serverOutput componentsSeparatedByString:@":"];
  [_appDelegate loggedIn:usernameField.text:passwordField.text:(int)[[_returnedArguments objectAtIndex:2] intValue]];

Ottengo questo errore:

passando l'argomento 3 di 'loggato :::' rende il puntatore da intero senza cast

Cosa c'è che non va?


Immagino che non ti serva la (int)parte
rano

2
Come viene dichiarato loggato :::? soprattutto che tipo del 3 ° parametro si aspetta?
Vladimir

È vero che non ne hai bisogno, ma ciò non porterebbe all'errore che vede.
Chuck

2
Per curiosità, da che lingua vieni? Ho visto un'ondata di persone che hanno fatto domande su Objective-C su SO dove hanno fatto chiamate a metodi che assomigliano al tuo loggedIn:::metodo, che è un modo decisamente non Objective-C di fare le cose.
kubi

1
No, lo è davvero loggedIn:::. Il resto di quella dichiarazione sono solo i nomi dei parametri, non parte del selettore. Idiomaticamente, dovrebbe essere - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. E poi lo chiameresti come [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
Chuck

Risposte:


267

Non so davvero cosa fosse così difficile in questa domanda, ma sono riuscito a farlo in questo modo:

[myStringContainingInt intValue];

Va notato che puoi anche fare:

myStringContainingInt.intValue;


2
Solo per noi niubbi là fuori provenienti da altre lingue, [myStringContainingInt intValue];può anche essere scritto comemyStringContainingInt.intValue;
ToddBFisher,

5
Cosa succede quando il numero all'interno myStringContainingIntè troppo grande per essere contenuto in 32 bit, in realtà 31 bit poiché è firmato?
Josh Hinman

Dovresti usare longValue in questo caso
dulgan

1
longLongValue per essere precisi
Leo Flaherty il

5
È importante notare che potresti -[NSString intValue]non comportarti esattamente come ti aspetti. Dalla documentazione : questa proprietà è 0 se la stringa non inizia con una rappresentazione di testo decimale valida di un numero. Ad esempio, [@" 2 asdghjk" intValue]tornerà 2.
zekel

8

Puoi semplicemente convertire la stringa in questo modo [str intValue] o [str integerValue]

integerValue Restituisce il valore NSInteger del testo del destinatario.

  • (NSInteger) integerValue Valore restituito Il valore NSInteger del testo del destinatario, assumendo una rappresentazione decimale e saltando gli spazi all'inizio della stringa. Restituisce 0 se il destinatario non inizia con una rappresentazione di testo decimale valida di un numero.

per maggiori informazioni fare riferimento qui


3
Rispondi a questo dopo che ci sono già tonnellate di risposte per la stessa cosa?
Christian Stewart

7
Ma stai scherzando? E se la stringa è "0"? È un errore o un'analisi corretta? Un po 'triste che Apple detesti le eccezioni, poiché questo è esattamente il posto in cui ne hai bisogno.
phreakhead

1
NSArray *_returnedArguments = [serverOutput componentsSeparatedByString:@":"];

_returnedArgumentsè un array di NSStringscui la UITextField textproprietà si aspetta. Non c'è bisogno di convertire.

Errore di sintassi:

[_appDelegate loggedIn:usernameField.text:passwordField.text:(int)[[_returnedArguments objectAtIndex:2] intValue]];

Se il tuo _appDelegate ha una passwordFieldproprietà, puoi impostare il testo usando quanto segue

[[_appDelegate passwordField] setText:[_returnedArguments objectAtIndex:2]];

Penso che tu sia stato radicalmente sbalordito dal nome strano del metodo e dall'invocazione scritta in modo goffo. La proprietà non "si aspetta una stringa" (qualunque cosa significhi) - passwordField.textè il secondo argomento del loggedIn:::metodo ed [[_returnedArguments objectAtIndex:2] intValue]è il terzo argomento. Nulla viene passato a una proprietà.
Chuck

dichiaro il nome del metodo un errore .. deducendo ciò che il codice sta tentando di fare ...
falconcreek

0

Fondamentalmente, il terzo parametro in loggedInnon dovrebbe essere un numero intero, dovrebbe essere un oggetto di qualche tipo, ma non possiamo saperlo con certezza perché non hai nominato i parametri nella chiamata al metodo. Fornisci la firma del metodo in modo che possiamo vederlo con certezza. Forse ci vuole NSNumberqualcosa o qualcosa.


1
Non deve essere necessariamente un oggetto. Avrebbe potuto erroneamente dichiarare il metodo come prendendo un int*- in effetti, questo mi sembra abbastanza probabile, dal momento che molte persone che scrivono Objective-C senza imparare le basi di C presumono che i tipi di parametro includano solo le stelle come parte della loro sintassi.
Chuck

Sì, non è corretto. Quello che vuoi è solo int (o meglio ancora, NSInteger, che è la stessa cosa). Hai solo bisogno di segni * prima degli oggetti oggettivo-c e un int non è un oggetto, è un tipo di dati primitivo. Quindi cambia la firma del metodo in solo (int) o (NSInteger) e dovrebbe risolverlo.
Jorge Israel Peña

0

Tieni presente che gli utenti internazionali potrebbero utilizzare un separatore decimale diverso dal .caso in cui i valori possono essere confusi o diventare nulli quando vengono utilizzati intValuesu una stringa.

Ad esempio, nel Regno Unito 1.23è scritto 1,23, quindi il numero 1.777sarebbe inserito dall'utente come 1,777, che, come .intValue, 1777non sarà 1(troncato).


Ho creato una macro che convertirà il testo di input in un NSNumber in base a un argomento locale che può essere nullo (se nullo utilizza la locale corrente del dispositivo).

#define stringToNumber(__string, __nullable_locale) (\
(^NSNumber *(void){\
NSLocale *__locale = __nullable_locale;\
if (!__locale) {\
__locale = [NSLocale currentLocale];\
}\
NSString *__string_copy = [__string stringByReplacingOccurrencesOfString:__locale.groupingSeparator withString:@""];\
__string_copy = [__string_copy stringByReplacingOccurrencesOfString:__locale.decimalSeparator withString:@"."];\
return @([__string_copy doubleValue]);\
})()\
)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.