Objective-Cのメソッド構文


176

誰かがこのメソッド宣言構文を私に説明できますか?この関数では、UIPickerView(iPhoneのスロットマシンUI)の行数が返されます。私の理解では、メソッドは ' pickerView' と呼ばれ、NSIntegerを返します。

pickerView最初に' ' というUIPickerviewへのポインタを渡します...最初に、メソッドがパラメータと同じ名前で呼ばれるのはなぜですか?

次に、コンポーネントと呼ばれるNSIntegerパラメータがあり、行をカウントしているコンポーネントを教えてくれます。メソッドの本体にあるものを決定するロジック。

って何numberOfRowsInComponent?返される値を説明しているように見えますが、パラメーターの真ん中にあります。

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component
{
    if (component == kStateComponent)
        return [self.states count];

    return[self.zips count];
}

回答:


358

Objective-Cのメソッドは自己文書化するように設計されており、Smalltalkの豊かな伝統を利用しています。

ここにあるものを説明しようと思います-(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component

  • - (NSInteger)
    この最初の部分は、これがNSIntegerオブジェクトを返すObjective Cのインスタンスメソッドであることを示しています。-(ダッシュ)は、これがあることを示しているインスタンスメソッド、+これがあることを示すであろうクラス方法。括弧内の最初の値は、メソッドの戻りタイプです。

  • pickerView:
    この部分はメッセージ名の一部です。この場合の完全なメッセージ名pickerView:numberOfRowsInComponent:です。Objective-Cランタイムはこのメソッド情報を取得して、指定されたレシーバーに送信します。純粋なCでは、これはのようになります
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component)。ただし、これはObjective-Cであるため、追加情報がメッセージ名にパックされます。

  • (UIPickerView*)pickerView
    この部分は入力の一部です。ここでの入力はタイプUIPickerView*で、pickerViewのローカル変数名を持っています。

  • numberOfRowsInComponent:
    この部分は、メッセージ名の 2番目の部分です。ここを見るとわかるように、メッセージ名は分割されており、受信側に渡す情報を示しています。したがって、変数fooとbarを使用してオブジェクトmyObjectにメッセージを送る場合
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    、C ++スタイルではなく、次のように入力します
    myObject.pickerView(foo, bar);

  • (NSInteger)component
    これは入力の最後の部分です。ここでの入力はタイプNSIntegerであり、コンポーネントのローカル変数名を持っています。


18
素晴らしい答えを得るには+1。「+」は正式にクラスメソッドを示しているため、最初のポイントで「ファクトリー」を「クラス」に変更することをお勧めします。多くの「+」メソッドはファクトリーメソッドですが、これは適切な定義ではありません。
e.James、2009年

2
ありがとう!追加の質問:表示されているように、変数fooおよびbarを使用してオブジェクトmyObjectにメッセージを送信する場合:[myObject pickerView:foo numberOfRowsInComponent:bar]; pickerViewはメソッド名またはパラメーターを参照しますか?
クレイグ

2
どちらでもない。メソッド名とパラメーターの両方を参照するのは良いスタイルですが、完全なメソッド名は実際にはpickerView:numberOfRowsInComponent:です。pickerView:を呼び出そうとすると、メソッドが存在しないため、実行時エラーが発生します。
locriani 2009年

1
それを明確にしましょう:pickerView:部分自体は、適切なコーディングスタイルに従って、次のパラメーターを参照する必要があります(SHOULD)。ただし、メソッド名の半分にすぎません。より良い例は[myObject setX:foo Y:bar]で、メソッドはsetX:Y:です。
locriani 2009年

1
私はこの答えが古いものであることを知っていますが、私は過去数年間.NETの世界に住んでいます。私はObjective Cを初めて使用し、Webの世界からモバイル業界に移行しています。質問に非常に関連する、十分に文書化された説明に感謝します。+1
d3v1lman1337 2012

52

Objective-Cでは、メソッドの名前は、引数と型ではない宣言のすべての部分で構成されます。したがって、このメソッドの名前は次のようになります。

pickerView:numberOfRowsInComponent:

このメソッドは、次のようなCスタイルの関数と同等です。

編集:Jarret Hardieのおかげで):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

1
+1-簡潔な説明。"NSInteger pickerViewNumberOfRowsInCompoent(UIPickerView * pickerView、NSInteger component)
Jarret Hardie

私はあなたの説明が好きです、Cで書き換えることははるかに優れています。
lcc 14

30

以前の回答に加えて、Objective-Cメソッド(または、必要に応じてメッセージ)には、外部パラメーター名と内部パラメーター名があると言っておきます。

したがって、この場合:

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component

numberOfRowsInComponent外部名であり、外部からこのメソッドを呼び出すときに使用する名前です。

そして、componentある内部パラメータの名前、あなたがメソッドの内部からパラメータを参照するために使用するもの。

それが少しそれをクリアすることを願っています。


1
説明に従って、メソッド名は最初のパラメータの外部名と見なすことができます。これは、以下のwilczarzのコメントにも適合します。
ジェイク

くそー、私はこの答えがとても間違っていると思います。パラメータの外部/内部名のようなものはありません。そのTYPEおよびVARIABLE ID。なぜ誰もがObjCを自然言語として定義するのが非常に難しいのか、それはすべての点で非常に不自然です。その言語、それ、それはそれの周りに派手な言葉を使わずにただそれを学ぶことができます。
Siddharth 2013年

引数は内部/外部名を持つことができます。それは本当だ。
lcc 14

21

Objective-Cのメソッドシグネチャは、より文に似ているように思えます。各パラメーターは、メソッド名の一部に値します。たとえば、Cでは、人に関する情報を設定するためのメソッド(setPersonData)を使用できます。

void setPersonData( char* name, int age, float height ) {

(とObjective-Cでの方法は、より記述的であろう:andAge:andHeight setPersonName等)

- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {

8
そして、なぜsetPersonalData(char * andName、int alsoAge、float alsoHeight)が意味をなさないのでしょうか?構文について理解していることがすべてであり、objcデザイナーがここで賢いという意図については何もありません。彼らは率直に言って意味のないより多くの構文を追加しただけです.. :)
Siddharth

5
あなたは私が恐れている答えを誤解しました。setPersonalData(char * andName、int alsoAge、float alsoHeight)はシグネチャであり、呼び出しではありません。この関数の呼び出しはsetPersonData( "Tom"、25、175)です-そして、それはそれが多くを言っているのではないでしょうか?Obj-Cの呼び出しは次のようになります。[person setPersonName:@ "Tom" andAge:25 andHeight:175];
wilczarz 2013

3
今考えてみると、私の反応は陳述よりも不満です。私はこれ以上同意できませんでした。
Siddharth、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.