webdevqa.jp.net

複数のパラメータを持つメソッド/メッセージを書く方法は?

複数のパラメータを使用してメソッド/メッセージをどのように記述しますか?

編集:単一のメソッド/メッセージの複数のパラメータのように、私は意味します。

16
Devoted

宣言は次のように書くことができます。

- (void) drawRoundedRect:(NSRect)aRect inView:(NSView *)aView withColor:(NSColor *)color fill:(BOOL)fill

後続の呼び出し(4つのパラメーターを使用)は次のようになります。

[self drawRoundedRect:rect inView:self withColor:[NSColor greenColor] fill:YES];

ここで、rectは以前に定義されたNSRect、selfはメソッドが呼び出されたNSView、ネストされたメソッド呼び出しから取得されたNSColorオブジェクト、および定数ブール値YES

33
Jeff Hellman

Objective-Cでは、メソッド名は適切に「セレクター」と呼ばれ、1つ以上の部分で構成できます。メソッドが1つ以上のパラメーターを受け入れる場合、セレクターの各部分は次の形式になります。

selectorFragmentName:(ParameterType)parameterName

たとえば、NSColorから次のようなメソッド宣言が表示されます。

+ (NSColor*) colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

この場合、メソッド(セレクター)の名前はcolorWithDeviceRed:green:blue:alpha: —残りはスコープ(-たとえばメソッド、+はクラス)、戻り値の型(ここではNSColor *)を示します。 、および各パラメーターのタイプと名前。

CRITICAL!他のほとんどの言語とは異なり、Objective-Cではメソッドをオーバーロードできません。つまり、同じセレクターでパラメーターの数やタイプの順序が異なる2つのメソッドを使用することはできません。たとえば、次の2つの方法を使用することはできません。

- (id) initWithObjects:(NSArray*)anArray;
- (id) initWithObjects:(NSSet*)aSet;

両方のセレクター名はinitWithObjects:であるため、Objective-Cは2つを区別しません。セレクター名は、非常に高速なルックアップのために一意の整数に変換されます。これは、動的ランタイムでは有益ですが、メソッドのオーバーロードを予期する人にとっては失望します。 Javaのような言語でのオーバーロードの最も一般的なケースはコンストラクターです。これは、alloc/initパターンのため、Objective-Cでは問題になりません。他の方法では、一意の名前を選択することで問題を回避できます。 。

スタイルの観点からは、パラメーターがメソッドセレクターに散在しているため、Objective-Cプログラマー(およびXcode)は、宣言/定義の両方で、読みやすさのために長いセレクターの部分をコロンに揃えることがよくあります。

+ (NSColor*) colorWithDeviceRed:(CGFloat)red
                          green:(CGFloat)green
                           blue:(CGFloat)blue
                          alpha:(CGFloat)alpha;

および呼び出し:

NSColor* myColor = [NSColor colorWithDeviceRed:0.5
                                         green:0.6
                                          blue:0.7
                                         alpha:0.9];

空白はコンパイラとは無関係です。読みやすく、理解しやすいものであれば、ぜひご利用ください。

14
Quinn Taylor

ジェフは、メソッドがどのように見えるかを正確に説明しました。 C関数としてどのように見えるかを確認したい場合は、次のようになります。

void drawRoundedRect_inView_withColor_fill( MyObject* self, SEL _cmd, NSRect aRect, NSView* aView, NSColor* color, BOOL fill );

パラメータ「names」はすべて結合して単一のメソッド名を形成し、2つの非表示パラメータselfと_cmdが前面に追加されます。

2
Peter N Lewis