Objective-Cで複数のパラメーターを渡すにはどうすればよいですか?


178

Objective-Cメソッドの構文に関する投稿をいくつか読んだことがありますが、メソッドの複数の名前が理解できないと思います。

私はと呼ばれるメソッドを作成しようとしているgetBusStopsNSStringし、NSTimeIntervalパラメータや戻り値の型をNSMutableArray。これは私がメソッドを作成した方法ですが、実行時に明らかにエラーが発生します:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

私はメソッドの別の例を見ました:

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

このメソッドに各パラメーターのメソッド名がある理由がわかりません。私は次のようなもので同じことをする必要があります:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval

回答:


120

Objective-Cには名前付きパラメーターがないため、コロンの左側のすべてがメソッド名の一部です。例えば、

getBusStops: forTime:

メソッドの名前です。名前は分割されているため、よりわかりやすくすることができます。あなたは単にあなたのメソッドに名前を付けることができます

getBusStops: :

しかし、それでは2番目のパラメーターについてはあまりわかりません。


157

各パラメータ名は、少なくとも「:」で区切る必要があります。技術的には名前はオプションですが、読みやすくするために推奨されています。だからあなたは書くことができます:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

またはあなたが提案したもの:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;

15
+1:Objective-C関数の引数は実際には名前ではなく定位置なので、ラベルはオプションであり、人間が使用するためのものです。
ジャレットハーディー

なぜ「forTime」がシグネチャで優先されるのかわからない、「timeInterval」は関数の2番目のパラメータとして使用できますよね?
ギャラクティカ

@galactica-もちろん、名前はあなたにとって最も意味のあるものなら何でもかまいません。この例では、一貫性を保つためにOPの用語を使用しています。
EM

2
まだ何がforTime使われているのか分かりませんか?
mrgloom 2018

71

はい; Objective-Cメソッドの構文は、いくつかの理由でこのようになります。これらの1つは、指定するパラメーターが何であるかを明確にするためです。たとえばNSMutableArray、特定のインデックスでにオブジェクトを追加する場合は、次のメソッドを使用してそれを行います。

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

このメソッドが呼び出さinsertObject:atIndex:れ、指定されたインデックスにオブジェクトが挿入されていることは明らかです。

実際には、「Hello、World!」という文字列を追加します。NSMutableArray呼び出し先のインデックス5では、array次のように呼び出されます。

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

これにより、メソッドパラメータの順序のあいまいさが減少し、最初にオブジェクトパラメータを渡し、次にインデックスパラメータます。これは、多数の引数を取る関数を使用するときにさらに役立ち、引数を渡す際のエラーを減らします。

さらに、Objective-Cはオーバーロードをサポートしていないため、メソッドの命名規則はそうです。ただし、同じ仕事をするが異なるデータ型をとるメソッドを作成したい場合は、これを実行できます。たとえば、NSNumberクラスを取る。これには、以下を含むいくつかのオブジェクト作成メソッドがあります。

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

C ++などの言語では、numberメソッドをオーバーロードして、さまざまなデータ型を引数として渡すことができます。ただし、Objective-Cでは、この構文により、関数の各バリアントのメソッド名を変更することにより、同じ関数のいくつかの異なるバリアントを実装できます。


関数名にパラメーター名が含まれている場合、メソッド呼び出し(メッセージ送信)中にパラメーター名が必要ですか?
Naveen、2010

24

各パラメーターの前のテキストはメソッド名の一部です。あなたの例から、メソッドの名前は実際には

-getBusStops:forTime:

各:は引数を表します。メソッド呼び出しでは、メソッド名は:sで分割され、引数は:segの後に表示されます。

[getBusStops: arg1 forTime: arg2]

3
メソッドの名前を追加するのを忘れたようです。
Özgür

11

createメソッドの場合:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

メソッドを呼び出す:

[mymethods:self.contoCorrente withsecond:self.asecond];

-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

私:

(returnTypeOfSecontArgument) secondArgumentName ;

他の言語と同様に、次の構文voidを使用しますadd(int one, int second) が、引数の割り当て方法はOBJ_c上記のように異なります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.