ObjectiveC Parse Inteiro da String


119

Estou tentando extrair uma seqüência de caracteres (que contém um número inteiro) de uma matriz e, em seguida, usá-lo como int em uma função. Estou tentando convertê-lo para um int usando intValue.

Aqui está o código que estou tentando.

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

Eu recebo este erro:

passando o argumento 3 de 'logIn :::' faz o ponteiro do número inteiro sem uma conversão

O que há de errado?


Eu acho que você não precisa da (int)parte
rano

2
Como logIn ::: é declarado? especialmente que tipo de terceiro parâmetro espera?
Vladimir

É verdade que você não precisa, mas isso não levaria ao erro que ele está vendo.
Chuck

2
Por curiosidade, de que idioma você vem? Eu já vi muitas pessoas fazendo perguntas sobre o Objective-C no SO, onde fizeram chamadas de métodos que se parecem com o seu loggedIn:::método, que é uma maneira decididamente não-objetiva-C de fazer as coisas.
Kbi

1
Não, é mesmo loggedIn:::. O restante dessa declaração são apenas nomes de parâmetros, não parte do seletor. Linguisticamente, deveria ser - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. E então você chamaria isso de [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
Chuck

Respostas:


267

Realmente não sei o que havia de tão difícil nessa questão, mas consegui fazê-lo desta maneira:

[myStringContainingInt intValue];

Note-se que você também pode fazer:

myStringContainingInt.intValue;


2
Apenas para nós, noobs por aí, vindos de outras línguas, [myStringContainingInt intValue];também pode ser escrito comomyStringContainingInt.intValue;
ToddBFisher

5
O que acontece quando o número interno myStringContainingInté muito grande para caber em 32 bits - na verdade 31 bits desde que foi assinado?
21713 Josh Hinman

Você deve usar longValue neste caso
dulgan

1
longLongValue para ser mais preciso #
Leo Flaherty

5
É importante observar que você -[NSString intValue]pode não se comportar exatamente como espera. Dos documentos : essa propriedade é 0 se a sequência não começar com uma representação válida de texto decimal de um número. Por exemplo, [@" 2 asdghjk" intValue]retornará 2.
zekel

8

Você pode simplesmente converter a string assim [str intValue] ou [str integerValue]

integerValue Retorna o valor NSInteger do texto do destinatário.

  • (NSInteger) integerValue Valor de retorno O valor NSInteger do texto do receptor, assumindo uma representação decimal e ignorando o espaço em branco no início da string. Retorna 0 se o receptor não começar com uma representação válida de texto decimal de um número.

para mais informações consulte aqui


3
Você responde isso depois de várias respostas para a mesma coisa já estarem aqui?
Christian Stewart

7
Você está brincando comigo? E se a sequência for "0"? É um erro ou uma análise correta? É triste que a Apple abomine exceções, já que este é exatamente o lugar que você precisa delas.
Phreakhead # 19/13

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

_returnedArgumentsé uma matriz da NSStringsqual a UITextField textpropriedade está esperando. Não há necessidade de converter.

Erro de sintaxe:

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

Se o seu _appDelegate tiver uma passwordFieldpropriedade, você poderá definir o texto usando o seguinte

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

Eu acho que você foi surpreendido radicalmente pelo nome estranho do método e pela invocação estranha por escrito. A propriedade não está "esperando uma string" (o que isso significa) - passwordField.texté o segundo argumento para o loggedIn:::método e [[_returnedArguments objectAtIndex:2] intValue]é o terceiro argumento. Nada está sendo passado para uma propriedade.
Chuck

i declarar o método nomear um erro .. inferir o que o código está tentando fazer ...
falconcreek

0

Basicamente, o terceiro parâmetro in loggedInnão deve ser um número inteiro, deve ser um objeto de algum tipo, mas não podemos ter certeza porque você não nomeou os parâmetros na chamada do método. Forneça a assinatura do método para que possamos ver com certeza. Talvez seja preciso um NSNumberou algo assim.


1
Não é necessariamente um objeto. Ele poderia ter declarado erroneamente o método como tendo um int*- de fato, isso me parece bastante provável, já que muitas pessoas que escrevem o Objective-C sem aprender o básico de C assumem que os tipos de parâmetros incluem apenas estrelas como parte de sua sintaxe.
Chuck

Sim, está incorreto. O que você quer é apenas int (ou melhor ainda, NSInteger, que é a mesma coisa). Você só precisa de sinais * antes dos objetos objetivo-c, e um int não é um objeto, é um tipo de dados primitivo. Portanto, altere a assinatura do método para just (int) ou (NSInteger), e deve corrigi-la.
Jorge Israel Peña

0

Lembre-se de que os usuários internacionais podem estar usando um separador decimal diferente daquele .em que os valores podem se confundir ou tornar-se nulos ao usar intValueem uma string.

Por exemplo, no Reino Unido 1.23está escrito 1,23, de modo que o número 1.777seria de entrada pelo usuário como 1,777, o que, como .intValue, será 1777não 1(truncado).


Eu fiz uma macro que converterá o texto de entrada em um NSNumber com base em um argumento de localidade que pode ser nulo (se nulo, ele usa a localidade atual do 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]);\
})()\
)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.