Цільовий синтаксичний синтаксичний аналіз від String


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:::метод, що є рішуче не об'єктивним способом 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, якщо бути точним
— Leo Flaherty

5
Важливо зазначити, що ви -[NSString intValue]можете вести себе не так, як очікуєте. З документів : Це властивість дорівнює 0, якщо рядок не починається з дійсного десяткового текстового зображення числа. Наприклад, [@" 2 asdghjk" intValue]повернеться 2.
— zekel

8

Можна просто перетворити такий рядок [str intValue] або [str integerValue]

integerValue Повертає значення NSInteger тексту одержувача.

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

Докладнішу інформацію див. тут


3
Ви відповідаєте на це після того, як вже знайдеться багато відповідей на те саме?
— Крістіан Стюарт

7
Ти мене жартуєш? Що робити, якщо рядок "0"? Це помилка чи правильний аналіз? Сумно, що Apple ухиляється від винятків, оскільки це саме те місце, яке вам потрібно.
— фрікхед

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]є третім аргументом. Нічого не передається у власність.
— Чак

Я оголошую назву методу помилкою. Висновок, що намагається зробити код ...
— falconcreek

0

В основному, третій параметр у loggedInне повинен бути цілим числом, він повинен бути певним об'єктом, але ми не можемо точно знати, оскільки ви не назвали параметри у виклику методу. Надайте підпис методу, щоб ми могли бачити точно. Можливо, це займає NSNumberте чи інше.


1
Це не обов'язково повинен бути об'єктом. Він міг помилково оголосити метод таким, що приймає int*- насправді, це здається мені досить імовірним, оскільки багато людей, які пишуть «Objective-C», не вивчаючи основ C, припускають, що типи параметрів просто включають зірки як частину їх синтаксису.
— Чак

Так, це неправильно. Те, що ви хочете, це просто int (а ще краще, NSInteger, це те саме). Вам потрібні лише * знаки перед об'єктами Obje-c, а int не є об'єктом, це примітивний тип даних. Тому змініть підпис методу на just (int) або (NSInteger), і він повинен це виправити.
— Хорхе Ізраїль Пенья

0

Майте на увазі, що міжнародні користувачі можуть використовувати десятковий роздільник, відмінний від .випадків, коли значення можуть змішуватися або просто ставати нульовими при використанні intValueна рядку.

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


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

#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.