ObjectiveC Анализировать целое число из строки


119

Я пытаюсь извлечь строку (содержащую целое число) из массива, а затем использовать ее как int в функции. Я пытаюсь преобразовать его в int с помощью intValue.

Вот код, который я пробовал.

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

Я получаю такую ​​ошибку:

передача аргумента 3 'loggedIn :::' делает указатель из целого числа без приведения

В чем дело?


Думаю, тебе не нужна эта (int)часть
— rano

2
Как объявлен loggedIn :::? особенно какой тип 3-го параметра он ожидает?
— Владимир

Это правда, что вам это не нужно, но это не приведет к той ошибке, которую он видит.
— Чак

2
Из любопытства, с какого ты языка? Я видел множество людей, которые задавали вопросы Objective-C о SO, когда они вызывали методы, похожие на ваш loggedIn:::, что явно не соответствует Objective-C.
— Куби

1
Нет, действительно так loggedIn:::. Остальная часть этого объявления - это просто имена параметров, а не часть селектора. Идиоматично, должно быть - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. И тогда вы бы назвали это как [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
— Чак

Ответы:


267

Я действительно не знаю, что было такого сложного в этом вопросе, но мне удалось это сделать так:

[myStringContainingInt intValue];

Следует отметить, что вы также можете:

myStringContainingInt.intValue;


2
Только для нас, новичков, пришедших с других языков, [myStringContainingInt intValue];также можно написать какmyStringContainingInt.intValue;
— ToddBFisher

5
Что произойдет, если число внутри myStringContainingIntслишком велико, чтобы поместиться в 32 бита - на самом деле 31 бит, поскольку он подписан?
— Джош Хинман

В этом случае вам следует использовать longValue
— dulgan

1
longLongValue, если быть точным
— Лео Флаэрти

5
Важно отметить, что вы -[NSString intValue]можете вести себя не так, как вы ожидаете. Из документации : это свойство равно 0, если строка не начинается с допустимого десятичного текстового представления числа. Например, [@" 2 asdghjk" intValue]вернется 2.
— zekel 02

8

Вы можете просто преобразовать строку вроде этой [str intValue] или [str integerValue]

integerValue Возвращает значение NSInteger текста получателя.

  • (NSInteger) integerValue Возвращаемое значение Значение NSInteger текста получателя, предполагающее десятичное представление и пропускающее пробелы в начале строки. Возвращает 0, если получатель не начинает с допустимого десятичного текстового представления числа.

для получения дополнительной информации обратитесь сюда


3
Вы ответите на этот вопрос после того, как уже есть масса ответов на одно и то же?
— Кристиан Стюарт

7
Ты шутишь, что ли? Что, если строка «0»? Это ошибка или правильный разбор? Немного грустно, что Apple не терпит исключений, поскольку именно здесь они вам нужны.
— phreakhead

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

_returnedArguments- массив, NSStringsкоторого UITextField textожидает свойство. Конвертировать не нужно.

Ошибка синтаксиса:

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

Если у вашего _appDelegate есть passwordFieldсвойство, вы можете установить текст, используя следующие

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

Я думаю, вы были радикально сбиты с толку странным названием метода и неудобно написанным вызовом. Свойство не «ожидает строку» (что бы это ни значило) - passwordField.textэто второй аргумент loggedIn:::метода и [[_returnedArguments objectAtIndex:2] intValue]третий аргумент. Ничего не передается в собственность.
— Чак,

Я объявляю имя метода ошибкой ...
— делая

0

По сути, третий параметр в loggedInне должен быть целым числом, это должен быть какой-то объект, но мы не можем знать наверняка, потому что вы не указали параметры в вызове метода. Предоставьте подпись метода, чтобы мы могли убедиться. Возможно, это нужно NSNumberили что-то в этом роде.


1
Это не обязательно должен быть объект. Он мог ошибочно объявить метод как принимающий int*- на самом деле, это кажется мне довольно вероятным, поскольку многие люди, которые пишут Objective-C, не изучая основ C, предполагают, что типы параметров просто включают звездочки как часть своего синтаксиса.
— Чак,

Ага, это неправильно. Вам нужно просто int (или еще лучше NSInteger, что то же самое). Вам нужны только знаки * перед объектами objective-c, а int не является объектом, это примитивный тип данных. Поэтому измените сигнатуру метода на просто (int) или (NSInteger), и она должна это исправить.
— Хорхе Исраэль Пенья,

0

Имейте в виду, что международные пользователи могут использовать десятичный разделитель, кроме .случаев, когда значения могут смешиваться или просто становиться нулевыми при использовании intValueв строке.

Например, в Великобритании 1.23написано 1,23, так что число 1.777будет вход со стороны пользователя , как 1,777, который, как .intValue, будет 1777не 1(усеченной).


Я сделал макрос, который преобразует вводимый текст в NSNumber на основе аргумента языкового стандарта, который может иметь значение nil (если nil, используется текущая локаль устройства).

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.