複数のパラメータを使用してメソッド/メッセージをどのように記述しますか?
編集:単一のメソッド/メッセージの複数のパラメータのように、私は意味します。
宣言は次のように書くことができます。
- (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
。
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];
空白はコンパイラとは無関係です。読みやすく、理解しやすいものであれば、ぜひご利用ください。
ジェフは、メソッドがどのように見えるかを正確に説明しました。 C関数としてどのように見えるかを確認したい場合は、次のようになります。
void drawRoundedRect_inView_withColor_fill( MyObject* self, SEL _cmd, NSRect aRect, NSView* aView, NSColor* color, BOOL fill );
パラメータ「names」はすべて結合して単一のメソッド名を形成し、2つの非表示パラメータselfと_cmdが前面に追加されます。