5

私はiOSプログラミングに飛び込んでいて、ドット表記とメソッド表記のアイデアに頭を悩ませています。

私が理解している限り、ドット表記を使用してプロパティのセッター/ゲッターを呼び出すことができ、書き込み/読み取りがはるかにクリーンになります。メソッド表記は、オブジェクトにメッセージを送信してオブジェクトを操作するために使用されます。

次の2つのステートメントが本質的に異なり、一方はコンパイルされますが、もう一方は構文エラーのために失敗する理由について、誰かが簡単に説明してくれませんか。

- (IBAction)digitPressed:(UIButton *)sender 
{
   NSString *digit = [sender currentTitle];

   self.display.text = [self.display.text stringByAppendingFormat:digit];
   self.display.text = self.display.text.stringByAppendingFormat:digit;

}

ありがとう。

4

6 に答える 6

12

古い構文が新しい構文で使用されている興味深い時期に、Objective-Cの開発に取り掛かっています。ドット構文はシンタックスシュガーであり、使用できるが使用すべきでない場合があります。

以下は無効な構文です。コロンを使用する場合(セッターまたはゲッターを除く)、ドット表記は使用しません。

self.display.text = self.display.text.stringByAppendingFormat:digit;

また、stringByAppendingStringではなく、を使用しますstringByAppendingFormat

効果のあるアクションを呼び出すためではなく、変数にアクセスするためにドット表記を使用します。

正しい: self.foo.attributeOfMyClass

正しくない: self.foo.downloadSomethingFromAWebsite

プロパティ値にアクセスするために常にドット表記を使用し、アクションメソッドを呼び出すために常にブラケット表記を使用するようにすると(必要がない場合でも)、コードは一目ではるかに明確になります

于 2012-07-08T20:16:46.623 に答える
5

ドット表記は、特定の種類のメソッド、つまりアクセサーの省略形です。次の場合に使用できます。

  1. プロパティを設定する場合:foo.bar = 3;は。と同等[foo setBar:3];です。
  2. プロパティをリクエストする場合:上記以外の場合は、foo.barと同等[foo bar]です。

ドット表記は省略形にすぎません。プロパティとの関係に魔法はありません。理論的foo.doSomethingには、ドット表記を使用して引数( )をとらないメッセージを送信できますが、ドット表記はプロパティを対象としているため、これは非常に悪いスタイルになります。また、学習中にドット表記と角かっこで混乱する場合は、ドット表記を完全に回避することが完全に有効な選択であることに注意してください。必要に応じて、アクセサに使用できるショートカットの1つにすぎません。

于 2012-07-08T20:22:48.783 に答える
3

実際、2番目のステートメントは正しくありません。メソッド(メッセージ)を呼び出すObjective Cの方法は、[インスタンスメッセージ]構文を使用することです。あなたが言ったように、ドット表記はクラスプロパティでゲッターとセッターを呼び出すだけであり、メッセージではありません。そのため、2番目のステートメントは正しくありません。比較したい2つの行は次のとおりです。

self.display.text = [self.display.text stringByAppendingFormat:digit];
[[self display] setText:[[[self display] text] stringByAppendingFormat:digit]];

メッセージstringByAppendingFormatは通常の方法で呼び出す必要があることに注意してください。ドット表記は、書き込みを高速化し、角かっこをそれほど多くしないことを目的としていますが、コンパイルするとまったく同じ命令を実行します。

于 2012-07-08T20:11:51.357 に答える
3

ドット表記ではなくセレクタ表記を使用するもう1つの理由は、Objective Cの動的言語機能によるものです。例として、次のことを考慮してください。

NSString *s = @"Hello World!";
NSLog(@"Length is %d", s.length);

これは期待どおりに機能します。ただし、Objective Cのオブジェクトは、タイプがで渡される場合がありますid。次のことを考慮してください。

id s = @"Hello World!";
NSLog(@"Length is %d", s.length);

と呼ばれるプロパティがないため、これはコンパイルされidませんlength。ただし、以下は機能します。

id s = @"Hello World!";
NSLog(@"Length is %d", [s length]);

これが機能する理由は、Objective CがについてNSString知っているため、セレクターに応答するオブジェクトタイプがあることを知っているためlengthです。もちろん、次のことを試してみてください。

id s = [[UIView alloc] init];
NSLog(@"Length is %d", [s length]);

コードは正しくコンパイルされますが、セレクターがないため、ランタイム例外が発生します( unrecognized selector sent to instance) 。UIViewlength

于 2013-07-07T23:47:25.650 に答える
3

両方の表記法を使用するClass変数を持つクラスがあるとしましょう。variableOne

ドット表記は、変数にアクセスするための最も純粋な方法です。これは、ブラケット表記が舞台裏で行われている可能性が最も高い方法でもあります。Class.variableOne「 ... 」と入力すると、「。」variableOneの一部になります。Classクラスがコンパイラに、クラスの一部(変数またはメソッド)にアクセスすることを通知した後。

括弧表記は、変数にアクセスするためのメソッドを使用します。まあ言ってみれば...

-(int) setVariable:x {
    self.variableOne = x;
}

-(int) showVariable {
    return self.variableOne
}

したがって、角かっこ表記を使用して変数を設定したり、変数[variableOne setVariable:5]を表示したりする[variableOne showVariable]場合は、適切なメソッドが呼び出されます。

これは違いを考える非常に簡単な方法です。別の答えがすでに受け入れられていることはわかっていますが、おそらくこの答えは別の答えを理解していない人にそれを説明するでしょう。

于 2014-02-21T06:04:13.230 に答える
2

コードがコンパイルされると、clangは実際に最初にすべてのドット表記を取得し、それをメソッド/ブラケット表記に変換するためself.display[self display]まったく同じです。ドット表記は、Objective-C2.0の時点では実際にはかなり新しいものです。それは単に便宜のためです。

ドット表記はプロパティにのみ使用できます。これは、(コンパイルされない)実行しようとしたようなことを行うのが面倒になるためです。

self.display.text.stringByAppendingFormat:digit;

また、引数の間にスペースを入れる必要があり、突然コード行がぎこちなく読みにくくなるため、複数の引数を取るメソッドでは機能しません。

于 2012-07-08T20:12:35.953 に答える