ObjectiveC Parse Integer from String

119

Ich versuche, eine Zeichenfolge (die eine Ganzzahl enthält) aus einem Array zu extrahieren und sie dann als int in einer Funktion zu verwenden. Ich versuche es mit intValue in ein int zu konvertieren.

Hier ist der Code, den ich versucht habe.

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

Ich erhalte diesen Fehler:

Wenn Sie das Argument 3 von 'loggedIn :::' übergeben, wird der Zeiger aus einer Ganzzahl ohne Umwandlung erstellt

Was ist los mit dir?

Christian Stewart
quelle
Ich denke, Sie brauchen den (int)Part
Rano
2
Wie wird angemeldet ::: deklariert? insbesondere welche Art von 3. Parameter erwartet es?
Vladimir
Es ist wahr, dass Sie es nicht brauchen, aber das würde nicht zu dem Fehler führen, den er sieht.
Chuck
2
Aus welcher Sprache kommst du aus Neugier? Ich habe eine Unmenge von Leuten gesehen, die Objective-C-Fragen zu SO gestellt haben, wo sie loggedIn:::Methodenaufrufe durchgeführt haben, die Ihrer Methode ähneln. Dies ist eine entschieden un-Objective-C-Methode, um Dinge zu tun.
Kubi
1
Nein, das ist es wirklich loggedIn:::. Der Rest dieser Deklaration besteht nur aus Parameternamen, die nicht Teil des Selektors sind. Idiomatisch sollte es sein - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. Und dann würden Sie es als nennen [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
Chuck

Antworten:

267

Ich weiß wirklich nicht, was an dieser Frage so schwer war, aber ich habe es so gemacht:

[myStringContainingInt intValue];

Es ist zu beachten, dass Sie auch Folgendes tun können:

myStringContainingInt.intValue;

Christian Stewart
quelle
2
Nur für uns Noobs da draußen, die aus anderen Sprachen kommen, [myStringContainingInt intValue];kann man auch schreiben wiemyStringContainingInt.intValue;
ToddBFisher
5
Was passiert, wenn die Zahl im Inneren myStringContainingIntzu groß ist, um in 32 Bit zu passen - tatsächlich 31 Bit seit dem Signieren?
Josh Hinman
Sie sollten in diesem Fall
longValue verwenden
1
longLongValue um genau zu sein
Leo Flaherty
5
Es ist wichtig zu beachten, dass Sie sich -[NSString intValue]möglicherweise nicht genau so verhalten, wie Sie es erwarten. Aus den Dokumenten : Diese Eigenschaft ist 0, wenn die Zeichenfolge nicht mit einer gültigen dezimalen Textdarstellung einer Zahl beginnt. [@" 2 asdghjk" intValue]Wird zum Beispiel zurückkehren 2.
Zekel
8

Sie können den String einfach so konvertieren: [str intValue] oder [str integerValue]

integerValue Gibt den NSInteger-Wert des Empfängertextes zurück.

  • (NSInteger) integerValue Rückgabewert Der NSInteger-Wert des Empfängertextes unter der Annahme einer Dezimaldarstellung und des Überspringens von Leerzeichen am Anfang der Zeichenfolge. Gibt 0 zurück, wenn der Empfänger nicht mit einer gültigen Dezimaltextdarstellung einer Zahl beginnt.

Weitere Informationen finden Sie hier

Danyun Liu
quelle
3
Sie beantworten dies, nachdem bereits unzählige Antworten für dieselbe Sache hier sind?
Christian Stewart
7
Willst du mich verarschen? Was ist, wenn die Zeichenfolge "0" ist? Ist es ein Fehler oder eine korrekte Analyse? Ein bisschen traurig, dass Apple Ausnahmen verabscheut, da dies genau der Ort ist, an dem Sie sie brauchen.
Phreakhead
1
NSArray *_returnedArguments = [serverOutput componentsSeparatedByString:@":"];

_returnedArgumentsist ein Array, von NSStringsdem die UITextField textEigenschaft erwartet. Keine Notwendigkeit zu konvertieren.

Syntax-Fehler:

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

Wenn Ihr _appDelegate eine passwordFieldEigenschaft hat, können Sie den Text wie folgt festlegen

[[_appDelegate passwordField] setText:[_returnedArguments objectAtIndex:2]];
Falconcreek
quelle
Ich denke, Sie wurden durch den seltsamen Methodennamen und die ungeschickte schriftliche Anrufung radikal abgeworfen. Die Eigenschaft "erwartet keine Zeichenfolge" (was auch immer das bedeutet) - passwordField.textist das zweite Argument für die loggedIn:::Methode und [[_returnedArguments objectAtIndex:2] intValue]das dritte Argument. Es wird nichts an eine Immobilie weitergegeben.
Chuck
Ich erkläre den Methodennamen als Fehler. Daraus schließe, was der Code zu tun versucht ...
Falconcreek
0

Grundsätzlich sollte der dritte Parameter in loggedInkeine Ganzzahl sein, es sollte ein Objekt sein, aber wir können es nicht sicher wissen, da Sie die Parameter im Methodenaufruf nicht benannt haben. Geben Sie die Methodensignatur an, damit wir sicher sehen können. Vielleicht braucht es ein NSNumberoder so.

Jorge Israel Peña
quelle
1
Es muss nicht unbedingt ein Objekt sein. Er hätte die Methode fälschlicherweise als "nehmen" deklarieren können int*- tatsächlich scheint mir das ziemlich wahrscheinlich zu sein, da viele Leute, die Objective-C schreiben, ohne die Grundlagen von C zu lernen, davon ausgehen, dass Parametertypen nur Sterne als Teil ihrer Syntax enthalten.
Chuck
Ja, das ist falsch. Was Sie wollen, ist nur int (oder noch besser NSInteger, was dasselbe ist). Sie benötigen nur * Zeichen vor Objective-C-Objekten, und ein Int ist kein Objekt, sondern ein primitiver Datentyp. Ändern Sie also die Methodensignatur in nur (int) oder (NSInteger), und es sollte behoben werden.
Jorge Israel Peña
0

Beachten Sie, dass internationale Benutzer möglicherweise ein anderes Dezimaltrennzeichen verwenden. .In diesem Fall können die Werte verwechselt werden oder bei Verwendung intValueeiner Zeichenfolge einfach Null werden .

Zum Beispiel in Großbritannien 1.23geschrieben 1,23, so dass die Zahl 1.777Eingabe durch den Benutzer sein würde , wie 1,777, was, wie .intValue, wird 1777nicht 1(gekürzt).


Ich habe ein Makro erstellt, das Eingabetext basierend auf einem Gebietsschemargument, das Null sein kann, in eine NS-Nummer konvertiert (wenn Null das aktuelle Gebietsschema des Geräts verwendet).

#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]);\
})()\
)
Albert Renshaw
quelle
-1

Wenn ich Sie richtig verstanden habe , müssen Sie konvertieren NSStringzu int? Versuchen Sie diesen Code-Frieden:

NSString *stringWithNumberInside = [_returnedArguments objectAtIndex:2];
int number;
sscanf([stringWithNumberInside UTF8String], "%x", &flags);
Beefon
quelle
4
NSString hat eine intValueMethode. developer.apple.com/iphone/library/documentation/cocoa/…
Chuck