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.