Цільовий синтаксичний синтаксичний аналіз від 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.