ObjectiveC Parse Integer from String


119

Próbuję wyodrębnić ciąg (który zawiera liczbę całkowitą) z tablicy, a następnie użyć go jako int w funkcji. Próbuję przekonwertować go na int przy użyciu intValue.

Oto kod, który próbowałem.

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

Otrzymuję ten błąd:

przekazanie argumentu 3 „loggedIn :::” powoduje, że wskaźnik jest liczbą całkowitą bez rzutowania

Co jest nie tak?


Chyba nie potrzebujesz tej (int)części
rano

2
Jak jest deklarowane logowanie :::? zwłaszcza jakiego typu trzeciego parametru oczekuje?
Vladimir

To prawda, że ​​jej nie potrzebujesz, ale to nie doprowadziłoby do błędu, który widzi.
Chuck

2
Z ciekawości, z jakiego języka pochodzisz? Widziałem wiele osób zadających pytania Objective-C na SO, gdzie wykonali wywołania metod, które wyglądają jak twoja loggedIn:::metoda, co jest zdecydowanie nie-Objective-C sposobem robienia rzeczy.
kubi

1
Nie, naprawdę jest loggedIn:::. Reszta tej deklaracji to tylko nazwy parametrów, a nie część selektora. Idiomatycznie, tak powinno być - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. A potem nazwałbyś to jako [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
Chuck

Odpowiedzi:


267

Naprawdę nie wiem, co było tak trudne w tym pytaniu, ale udało mi się to zrobić w ten sposób:

[myStringContainingInt intValue];

Należy zauważyć, że możesz również:

myStringContainingInt.intValue;


2
Tylko dla nas, noobów pochodzących z innych języków, [myStringContainingInt intValue];można również napisać takmyStringContainingInt.intValue;
ToddBFisher

5
Co się dzieje, gdy liczba w środku myStringContainingIntjest zbyt duża, aby zmieścić się w 32 bitach - w rzeczywistości 31 bitów od czasu podpisu?
Josh Hinman

W tym przypadku powinieneś użyć longValue
dulgan

1
longLongValue, aby być precyzyjnym
Leo Flaherty

5
Należy pamiętać, że możesz -[NSString intValue]nie zachowywać się dokładnie tak, jak tego oczekujesz. Z dokumentacji : ta właściwość ma wartość 0, jeśli ciąg nie zaczyna się od prawidłowej dziesiętnej reprezentacji liczby w postaci tekstu. Na przykład [@" 2 asdghjk" intValue]zwróci 2.
zekel

8

Możesz po prostu przekonwertować ciąg w ten sposób [str intValue] lub [str integerValue]

integerValue Zwraca wartość NSInteger tekstu odbiorcy.

  • (NSInteger) integerValue Zwracana wartość Wartość NSInteger tekstu odbiorcy, przy założeniu reprezentacji dziesiętnej i pomijaniu białych znaków na początku ciągu. Zwraca 0, jeśli odbiornik nie zaczyna się od prawidłowej dziesiętnej reprezentacji liczby w postaci tekstu.

więcej informacji znajdziesz tutaj


3
Odpowiadasz na to po tym, jak mnóstwo odpowiedzi na to samo jest już tutaj?
Christian Stewart,

7
Czy ty żartujesz? A jeśli ciąg ma wartość „0”? Czy to błąd czy poprawna analiza? Trochę smutne, że Apple brzydzi się wyjątkami, ponieważ jest to dokładnie miejsce, w którym ich potrzebujesz.
phreakhead

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

_returnedArgumentsjest tablicą, NSStringsktórej UITextField textoczekuje właściwość. Nie ma potrzeby konwersji.

Błąd składni:

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

Jeśli Twoja _appDelegate ma passwordFieldwłaściwość, możesz ustawić tekst, korzystając z poniższego

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

Myślę, że zostałeś radykalnie odrzucony przez dziwną nazwę metody i niezręcznie napisane wywołanie. Właściwość nie „oczekuje łańcucha znaków” (cokolwiek to znaczy) - passwordField.textjest drugim argumentem loggedIn:::metody i [[_returnedArguments objectAtIndex:2] intValue]trzecim argumentem. Nic nie jest przekazywane do nieruchomości.
Chuck

Ogłaszam sposób wymienić błąd .. wnioskowanie co kod próbuje zrobić ...
falconcreek

0

Zasadniczo trzeci parametr w loggedInnie powinien być liczbą całkowitą, powinien to być jakiś obiekt, ale nie możemy tego wiedzieć na pewno, ponieważ nie nadałeś nazwy parametrom w wywołaniu metody. Podaj podpis metody, abyśmy mogli się upewnić. Może to wymaga NSNumberczegoś.


1
Niekoniecznie musi to być przedmiot. Mógłby omyłkowo zadeklarować metodę jako przyjmującą int*- w rzeczywistości wydaje mi się to całkiem prawdopodobne, ponieważ wiele osób piszących Objective-C bez poznania podstaw C zakłada, że ​​typy parametrów zawierają tylko gwiazdy jako część swojej składni.
Chuck

Tak, to nieprawda. To, czego chcesz, to po prostu int (lub jeszcze lepiej, NSInteger, co jest tym samym). Potrzebujesz tylko znaków * przed obiektami Objective-c, a int nie jest obiektem, to prymitywny typ danych. Więc zmień sygnaturę metody na po prostu (int) lub (NSInteger) i powinno to naprawić.
Jorge Israel Peña

0

Należy pamiętać, że użytkownicy międzynarodowi mogą używać separatora dziesiętnego innego niż wtedy, .gdy wartości mogą się pomieszać lub po prostu stać się zerowe, gdy są używane intValuew ciągu.

Na przykład w Wielkiej Brytanii 1.23jest napisane 1,23, więc liczba 1.777byłoby wejście przez użytkownika jak 1,777, co, jak .intValuebędzie 1777nie 1(skrócony).


Zrobiłem makro, które konwertuje tekst wejściowy na numer NSNumber na podstawie argumentu ustawień regionalnych, który może być zerowy (jeśli nil używa bieżącego ustawienia regionalnego urządzenia).

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.