ObjectiveC Parse Integer from String


119

Estoy tratando de extraer una cadena (que contiene un número entero) de una matriz y luego usarla como un int en una función. Estoy tratando de convertirlo en un int usando intValue.

Aquí está el código que he estado probando.

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

Me sale este error:

pasar el argumento 3 de 'logIn :::' hace que el puntero sea un número entero sin una conversión

¿Qué pasa?


Supongo que no necesitas el (int)papel
rano

2
¿Cómo se declara logIn :::? especialmente, ¿qué tipo de tercer parámetro espera?
Vladimir

Es cierto que no lo necesita, pero eso no provocaría el error que está viendo.
Chuck

2
Por curiosidad, ¿de qué idioma vienes? He visto una serie de personas que hacen preguntas de Objective-C en SO en las que han realizado llamadas a métodos que se parecen a su loggedIn:::método, que es una forma decididamente no Objective-C de hacer las cosas.
kubi

1
No, realmente lo es loggedIn:::. El resto de esa declaración son solo nombres de parámetros, no parte del selector. Idiomáticamente, debería serlo - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. Y luego lo llamarías como [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
Chuck

Respuestas:


267

Realmente no sé qué fue tan difícil sobre esta pregunta, pero me las arreglé para hacerlo de esta manera:

[myStringContainingInt intValue];

Cabe señalar que también puedes hacer:

myStringContainingInt.intValue;


2
Solo para nosotros, los novatos que vienen de otros idiomas, [myStringContainingInt intValue];también se puede escribir comomyStringContainingInt.intValue;
ToddBFisher

5
¿Qué sucede cuando el número dentro myStringContainingIntes demasiado grande para caber dentro de 32 bits, en realidad 31 bits desde que está firmado?
Josh Hinman

Debería usar longValue en este caso
dulgan

1
longLongValue para ser precisos
Leo Flaherty

5
Es importante tener en cuenta que es -[NSString intValue]posible que no se comporte exactamente como espera. De los documentos : esta propiedad es 0 si la cadena no comienza con una representación de texto decimal válida de un número. Por ejemplo, [@" 2 asdghjk" intValue]volverá 2.
zekel

8

Puede convertir la cadena así [str intValue] o [str integerValue]

integerValue Devuelve el valor NSInteger del texto del receptor.

  • (NSInteger) integerValue Valor de retorno El valor NSInteger del texto del receptor, asumiendo una representación decimal y omitiendo los espacios en blanco al comienzo de la cadena. Devuelve 0 si el receptor no comienza con una representación de texto decimal válida de un número.

para obtener más información, consulte aquí


3
¿Respondes esto después de que ya estén aquí toneladas de respuestas para lo mismo?
Christian Stewart

7
¿Me estás tomando el pelo? ¿Qué pasa si la cadena es "0"? ¿Es un error o un análisis correcto? Es un poco triste que Apple aborrezca las excepciones, ya que este es exactamente el lugar donde las necesita.
phreakhead

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

_returnedArgumentses una matriz de la NSStringsque UITextField textespera la propiedad. No es necesario convertir.

Error de sintaxis:

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

Si su _appDelegate tiene una passwordFieldpropiedad, entonces puede configurar el texto usando lo siguiente

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

Creo que el extraño nombre del método y la invocación escrita de forma incómoda te han desorientado radicalmente. La propiedad no "espera una cadena" (lo que sea que eso signifique) - passwordField.textes el segundo argumento del loggedIn:::método y [[_returnedArguments objectAtIndex:2] intValue]es el tercer argumento. No se pasa nada a una propiedad.
Chuck

Declaro que el nombre del método es un error ... infiriendo lo que el código está intentando hacer ...
falconcreek

0

Básicamente, el tercer parámetro loggedInno debe ser un número entero, debe ser un objeto de algún tipo, pero no podemos saberlo con certeza porque no nombró los parámetros en la llamada al método. Proporcione la firma del método para que podamos verlo con seguridad. Quizás se necesita NSNumberalgo o algo.


1
No se supone necesariamente que sea un objeto. Podría haber declarado erróneamente que el método tomaba un int*, de hecho, eso me parece bastante probable, ya que muchas personas que escriben Objective-C sin aprender los conceptos básicos de C asumen que los tipos de parámetros solo incluyen estrellas como parte de su sintaxis.
Chuck

Sí, es incorrecto. Lo que quieres es solo int (o mejor aún, NSInteger, que es lo mismo). Solo necesita * signos antes de los objetos objetivo-c, y un int no es un objeto, es un tipo de datos primitivo. Así que cambie la firma del método a solo (int) o (NSInteger), y debería solucionarlo.
Jorge Israel Peña

0

Tenga en cuenta que los usuarios internacionales pueden estar usando un separador decimal distinto de, .en cuyo caso los valores pueden confundirse o simplemente volverse nulos cuando se usan intValueen una cadena.

Por ejemplo, en el Reino Unido 1.23está escrito 1,23, por lo que el número 1.777sería de entrada por el usuario como 1,777, que, como .intValue, será 1777no 1(truncado).


Hice una macro que convertirá el texto de entrada a un NSNumber basado en un argumento de configuración regional que puede ser nulo (si es nulo, usa la configuración regional actual 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]);\
})()\
)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.