2

私はobj-cを学ぼうとしていますが、ここに私が理解できないことがあります。私はいくつかのC#を知っているので、誰かがこれをac#y-wayで説明しようとすることができます.

#import <Foundation/Foundation.h> @interface Car : NSObject
@interface Car : NSObject
  {
  int year;
  NSString *make;
  NSString *model;
  }

  **- (void) setMake:(NSString *) aMake andModel:(NSString *) aModel andYear: (int) aYear;**
  - (void) printCarInfo;
  - (int) year;
@end

変数の宣言は理解していると思いますが、メソッドについてはわかりません。誰かがこれが何をするのか説明できますか (太字のコード)?

4

2 に答える 2

2

あなたの学習に欠けている概念は「セレクター」です。これは本質的に、括弧で囲まれたパラメーターの受け渡しで得られるよりも多くのセマンティクスでメソッド シグネチャを "装飾" するようなものです。メソッドのプロトタイプには、説明的な文のような「セレクター」を使用する傾向があります。例として、次の基本関数を考えてみましょう。

void function setDimensions(int width, int height);

Objective-C では、次のように記述します。

- (void) setWidth:(int) newWidth height:(int) newHeight;

また、「セレクター」( Objective-C のファーストクラスの概念) はsetWith:height: です(コロンを含みますが、それ以外は含みません)。それが、そのクラスのメソッドを一意に識別するものです。

セレクターのコロンの後に引数を配置してそのオブジェクトにメッセージを送信すると、実行時にそのメソッドが呼び出されます。したがって、メッセージには 3 つの重要なコンポーネントがあります。受信者、セレクター、適切に配置された引数です。

[anObject setWidth: 1024 height: 768];

ここで、anObjectは受信者、setWidth:height:はセレクター (ランタイムがメソッドを見つけるのに役立ちます)、引数は次のとおりnewWidth = 1024; newHeight = 768;です。

次に、メソッドの実装で、期待どおりに newWidth と newHeight を使用します。

- (void) setWidth:(int) newWidth height:(int) newHeight; {
    self.width = newWidth; // 1024
    self.height = newHeight; // 768
}

最初はぎこちなく余分に思えるかもしれませんが、慣れてくるとそれが好きになり、他の言語でより長く、より意味のある関数名を書いていることに気付くでしょう。

セレクターに関連する概念は、Objective-C ランタイムのいくつかの基本、特に「メッセージの送信」の概念 (「メソッドの呼び出し」ではなく) と一緒に学習すると、よりよく理解できます。メッセージで使用するセレクターに基づいて実際のメソッドが検索される時間。これが実行時に行われるという事実は、非常に動的なアーキテクチャに驚くべき柔軟性をもたらします。

于 2012-08-27T22:48:08.977 に答える
0

Objective-C では、メソッドには名前付き引数があります。メソッド宣言の構文は次のようになります。

- (returnValue)nameOfArgument1:(typeOfArgument1)nameOfVariable1 
               nameOfArgument2:(typeOfArgument2)nameOfVariable2 
               nameOfArgument3:(typeOfArgument3)nameOfVariable3;

改行はもちろんオプションですが、少なくとも 1 つのスペースで引数を区切る必要があります。最初の行の - 記号は、これがインスタンス メソッドであることを意味します (+ 記号で始まるクラス メソッドとは対照的です)。

.m ファイルの実装は、セミコロンを実装に置き換えることを除いて、まったく同じように見えます。

- (returnValue)nameOfArgument1:(typeOfArgument1)nameOfVariable1 
               nameOfArgument2:(typeOfArgument2)nameOfVariable2 
               nameOfArgument3:(typeOfArgument3)nameOfVariable3 {
    // Implementation
    // Return something of type "returnValue".
}

そして、次のように別の場所からこのメソッドを呼び出します。

[myObject nameOfArgument1:variableToPass1 
          nameOfArgument2:variableToPass2
          nameOfArgument3:variableToPass3];

これにより、物事がもう少し明確になることを願っています。

于 2012-08-27T22:37:06.353 に答える