ObjectiveC Parse Integer from String


119

J'essaie d'extraire une chaîne (qui contient un entier) d'un tableau, puis de l'utiliser comme int dans une fonction. J'essaye de le convertir en int en utilisant intValue.

Voici le code que j'ai essayé.

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

J'obtiens cette erreur:

passer l'argument 3 de 'LogIn :::' crée un pointeur à partir d'un entier sans conversion

Qu'est-ce qui ne va pas?


Je suppose que vous n'avez pas besoin de la (int)pièce
rano

2
Comment est déclaré connecté :::? surtout quel type du 3ème paramètre il attend?
Vladimir

Il est vrai que vous n'en avez pas besoin, mais cela ne conduirait pas à l'erreur qu'il voit.
Chuck

2
Par curiosité, de quelle langue venez-vous? J'ai vu une série de personnes poser des questions Objective-C sur SO où elles ont fait des appels de méthode qui ressemblent à votre loggedIn:::méthode, ce qui est une manière résolument non-Objective-C de faire les choses.
kubi

1
Non, c'est vraiment le cas loggedIn:::. Le reste de cette déclaration n'est que des noms de paramètres et ne fait pas partie du sélecteur. Idiomatiquement, ça devrait l'être - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. Et puis vous l'appeleriez comme [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
Chuck

Réponses:


267

Je ne sais vraiment pas ce qui était si difficile dans cette question, mais j'ai réussi à le faire de cette façon:

[myStringContainingInt intValue];

Il est à noter que vous pouvez également faire:

myStringContainingInt.intValue;


2
Juste pour nous, les noobs venant d'autres langues [myStringContainingInt intValue];peuvent également être écrits commemyStringContainingInt.intValue;
ToddBFisher

5
Que se passe-t-il lorsque le nombre à l'intérieur myStringContainingIntest trop grand pour tenir dans 32 bits - en fait 31 bits depuis qu'il est signé?
Josh Hinman

Vous devriez utiliser longValue dans ce cas
dulgan

1
longLongValue pour être précis
Leo Flaherty

5
Il est important de noter que vous -[NSString intValue]ne vous comporterez peut-être pas exactement comme vous le souhaitez. À partir de la documentation : Cette propriété est 0 si la chaîne ne commence pas par une représentation textuelle décimale valide d'un nombre. Par exemple, [@" 2 asdghjk" intValue]retournera 2.
zekel

8

Vous pouvez simplement convertir la chaîne comme ça [str intValue] ou [str integerValue]

integerValue Renvoie la valeur NSInteger du texte du destinataire.

  • (NSInteger) integerValue Valeur renvoyée Valeur NSInteger du texte du destinataire, en supposant une représentation décimale et en ignorant les espaces au début de la chaîne. Renvoie 0 si le récepteur ne commence pas par une représentation textuelle décimale valide d'un nombre.

pour plus d'informations, reportez-vous ici


3
Vous répondez à cela après que des tonnes de réponses pour la même chose sont déjà là?
Christian Stewart

7
Vous plaisantez j'espère? Que faire si la chaîne est "0"? Est-ce une erreur ou une analyse correcte? Un peu triste qu'Apple déteste les exceptions, car c'est exactement l'endroit où vous en avez besoin.
phreakhead

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

_returnedArgumentsest un tableau NSStringsdont la UITextField textpropriété attend. Pas besoin de convertir.

Erreur de syntaxe:

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

Si votre _appDelegate a une passwordFieldpropriété, vous pouvez définir le texte à l'aide de la commande suivante

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

Je pense que vous avez été radicalement rebuté par le nom de méthode étrange et l'invocation mal écrite. La propriété "n'attend pas une chaîne" (quoi que cela signifie) - passwordField.textest le deuxième argument de la loggedIn:::méthode et [[_returnedArguments objectAtIndex:2] intValue]est le troisième argument. Rien n'est transmis à une propriété.
Chuck

Je déclare que le nom de la méthode est une erreur .. en déduisant ce que le code tente de faire ...
falconcreek

0

Fondamentalement, le troisième paramètre de loggedInne doit pas être un entier, il doit s'agir d'un objet quelconque, mais nous ne pouvons pas le savoir avec certitude car vous n'avez pas nommé les paramètres dans l'appel de méthode. Fournissez la signature de la méthode afin que nous puissions voir avec certitude. Peut-être que cela prend un NSNumberou quelque chose.


1
Ce n'est pas nécessairement censé être un objet. Il aurait pu déclarer à tort la méthode comme prenant un int*- en fait, cela me semble assez probable, car beaucoup de gens qui écrivent Objective-C sans apprendre les bases de C supposent que les types de paramètres incluent simplement les étoiles dans leur syntaxe.
Chuck

Ouais, c'est incorrect. Ce que vous voulez, c'est juste int (ou mieux encore, NSInteger, qui est la même chose). Vous n'avez besoin que des signes * avant les objets objective-c, et un int n'est pas un objet, c'est un type de données primitif. Changez donc la signature de la méthode en juste (int) ou (NSInteger), et cela devrait le corriger.
Jorge Israel Peña

0

Gardez à l'esprit que les utilisateurs internationaux peuvent utiliser un séparateur décimal autre que .auquel cas les valeurs peuvent être mélangées ou simplement devenir nulles lors de l'utilisation intValuesur une chaîne.

Par exemple, au Royaume 1.23- Uni est écrit 1,23, de sorte que le nombre 1.777serait entré par l'utilisateur comme 1,777, qui, comme .intValue, ne sera 1777pas 1(tronqué).


J'ai fait une macro qui convertira le texte d'entrée en NSNumber basé sur un argument de locale qui peut être nul (si nul, il utilise la locale actuelle du périphérique).

#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]);\
})()\
)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.