16

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

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

4

3 に答える 3

33

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

- (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です。

于 2009-07-01T00:23:43.327 に答える
15

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 *)、およびのタイプと名前を示します。各パラメータ。

致命的!他のほとんどの言語とは異なり、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];

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

于 2009-07-01T05:00:37.267 に答える
2

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

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

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

于 2009-07-01T02:25:39.430 に答える