1

とにかく、私は非常に環境に配慮した初心者です。次のように、NSLocaleクラスを使用して現地通貨を取得する方法を説明するチュートリアルを実行しています。

NSLocale *here = [NSLocale currentLocale];
NSString *currency = [here objectForKey:NSLocaleCountryCode];
NSLog(@"Money is %@", currency);

したがって、「here」というNSLocaleクラスのインスタンスを作成していることを理解し、「here」オブジェクトにobjectForKeyを要求するメッセージを送信すると、結果が「currency」というNSStringに返されます。最後に、NSLogを使用して通貨の値を出力します。

さて、これが私の質問です。次に、NSLocaleクラスにある他のメソッドを確認し、「preferredLanguages」という名前のメソッドを見つけました。これは、優先言語の配列を返します。だから私はそのメソッドを呼び出して、それをログに印刷しますが、ただニヤリと学びやすくするためです。上記の例から離れて、私はそれをこのように呼ぶだろうと思いました。上記のコードから「here」というNSLocaleクラスのインスタンスがすでにあるという事実から始めて、次のものが必要だと思いました(ここで読みやすいように、上記の3行を繰り返しています)。

NSLocale *here = [NSLocale currentLocale];
NSString *currency = [here objectForKey:NSLocaleCountryCode];
NSLog(@"Money is %@", currency);

NSArray *prefLangs = [here preferredLanguages];
NSLog(@"Preferred Languages are: %@", prefLangs);

しかし、それは機能しませんでした。「「NSLocale」の表示された@interfaceがセレクター「preferredLanguages」を宣言していません」というエラーメッセージが表示されました。

私は代わりにこの方法でそれをしなければならないことを理解しました:

NSLocale *here = [NSLocale currentLocale];
NSString *currency = [here objectForKey:NSLocaleCountryCode];
NSLog(@"Money is %@", currency);

NSArray *prefLangs = [NSLocale preferredLanguages];
NSLog(@"Preferred Languages are: %@", prefLangs);

[ここではpreferredLanguages]ではなく[NSLocalepreferredLanguages]のようなメソッドを呼び出さなければならなかった理由がわかりません。'here'のインスタンスはすでに上に作成されています。誰か説明してもらえますか?

4

1 に答える 1

1

Objective Cの喜びと苦痛にすぐに慣れることができますが、簡単な答えは、次のようなメソッド宣言を確認することです。

+ preferredLanguages:

宣言の「+」は、それがクラスメソッドであることを示します。

これは、 Appleの「LearningObjectiveC」ドキュメントの関連する段落です。

Objective-Cのクラスは、インスタンスメソッドとクラスメソッドの2種類のメソッドを宣言できます。インスタンスメソッドは、その実行がクラスの特定のインスタンスにスコープされているメソッドです。つまり、インスタンスメソッドを呼び出す前に、まずクラスのインスタンスを作成する必要があります。比較すると、クラスメソッドではインスタンスを作成する必要はありませんが、後で詳しく説明します。

宣言が「-」で始まる場合、それはインスタンスメソッドになり、そのオブジェクトのメソッドを呼び出すには、インスタンスをインスタンス化(作成)する必要があります。

うまくいけば、これはこれまでのところ理にかなっています。

于 2012-05-29T03:40:19.903 に答える