文字列からのObjectiveC解析整数


119

私は配列から文字列(整数を含む)を抽出し、それを関数のintとして使用しようとしています。intValueを使用してintに変換しようとしています。

これが私が試したコードです。

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

私はこのエラーを受け取ります:

「loggedIn :::」の引数3を渡すと、キャストなしで整数からポインタが作成されます

どうしましたか?


私はあなたがその(int)部分を必要としないと思います
rano

2
どのようにloggedIn :::が宣言されていますか?特に、どのようなタイプの3番目のパラメーターが想定されていますか?
ウラジミール

あなたがそれを必要としないことは事実ですが、それは彼が見ているエラーにはつながりません。
チャック

2
好奇心から、あなたはどの言語から来ましたか?私がSOでObjective-Cに質問してloggedIn:::、あなたのメソッドのように見えるメソッド呼び出しを行った人々の発疹を見てきました。
kubi

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ビットの場合はどうなりますか?
Josh Hinman

この場合はlongValueを使用する必要があります
dulgan

1
正確にはlongLongValue
Leo Flaherty

5
-[NSString intValue]期待どおりに動作しない可能性があることに注意することが重要です。docsから:文字列が数値の有効な10進テキスト表現で始まっていない場合、このプロパティは0です。たとえば、[@" 2 asdghjk" intValue]が返され2ます。
ゼケル

8

そのような[str intValue]または[str integerValue]のような文字列を変換することができます

integerValueレシーバーのテキストのNSInteger値を返します。

  • (NSInteger)integerValue戻り値10進表記を想定し、文字列の先頭の空白をスキップする、受信側のテキストのNSInteger値。レシーバが数値の有効な10進数テキスト表現で始まっていない場合は、0を返します。

詳細については、こちらを参照してください


3
同じことに対するたくさんの答えがすでにここにあるので、あなたはこれに答えますか?
クリスチャンスチュワート

7
私をからかってるの?文字列が「0」の場合はどうなりますか?それはエラーですか、それとも正しい解析ですか?これはまさにあなたがそれらを必要とする場所なので、Appleが例外を嫌うのはちょっと悲しいことです。
phreakhead 2013年

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:::メソッドの2番目の引数で [[_returnedArguments objectAtIndex:2] intValue]あり、3番目の引数です。プロパティに何も渡されていません。
チャック

メソッド名にエラーを宣言します。コードが実行しようとしていることを推測しています...
falconcreek

0

基本的に、3番目のパラメーターはloggedIn整数ではなく、何らかのオブジェクトである必要がありますが、メソッド呼び出しでパラメーターに名前を付けなかったため、確信が持てません。確実に確認できるように、メソッドシグネチャを提供します。多分それはNSNumber何かをとります。


1
必ずしもオブジェクトである必要はありません。int*Cの基礎を学ばずにObjective-Cを書く人の多くは、パラメーター型には構文の一部としてスターしか含まれていないと想定しているため、彼は誤ってメソッドを取ると宣言した可能性があります。
Chuck

ええ、それは間違っています。必要なのはintだけです(もっといいのはNSIntegerですが、同じものです)。*記号が必要なのは、objective-cオブジェクトの前だけです。intはオブジェクトではなく、プリミティブデータ型です。したがって、メソッドシグネチャを(int)または(NSInteger)だけに変更すると、修正されるはずです。
ホルヘイスラエルペーニャ

0

国際的なユーザーは、小数点記号を使用している可能性があることに注意し.てください。intValue文字列ですると、。

例えば、英国で1.23書き込まれている1,23数がので、1.777などのユーザによって入力されることになる1,777、として.intValue、され1777ていない1(切り捨て)を。


私は、nilのロケール引数(nilがデバイスの現在のロケールを使用している場合)に基づいて、入力テキストを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]);\
})()\
)

-1

私があなたを正しく理解しているなら、あなたはあなたNSStringをに変換する必要がありますintか?このコードの平和を試してください:

NSString *stringWithNumberInside = [_returnedArguments objectAtIndex:2];
int number;
sscanf([stringWithNumberInside UTF8String], "%x", &flags);

4
NSStringにはintValueメソッドがあります。developer.apple.com/iphone/library/documentation/cocoa/...
チャック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.