2009-10-15 15 views
8

私は新しいiPhone/Objective-C開発者です。異なるチュートリアルやオープンソースコードを使用しているので、少し問題があります角括弧 "[]"を使用するときと、オブジェクトのプロパティ/メソッドにアクセスするときにピリオド "。"を使用するときを理解する。例えばブラケットを使用する時期とObjective-Cの期間を使用する時期

、このコード:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 

    [super setSelected:selected animated:animated]; 

    UIColor *backgroundColor = nil; 
    if (selected){ 
    backgroundColor = [UIColor clearColor]; 
    } else { 
    backgroundColor = [UIColor whiteColor]; 
    } 

    self.todoTextLabel.backgroundColor = backgroundColor; 
    self.todoTextLabel.highlighted = selected; 
    self.todoTextLabel.opaque = !selected; 

    self.todoPriorityLabel.backgroundColor = backgroundColor; 
    self.todoPriorityLabel.highlighted = selected; 
    self.todoPriorityLabel.opaque = !selected; 
} 

はなぜ[UIColor clearColor]は期間を取得todoTextLabel.backgroundColorブラケットを得るが、ん?

誰かが私にこのことを簡単に説明できますか?

+0

のいずれかを使用できます。 Objective-C 2.0ではいくつかの新機能を実現するためにdotメソッドが導入されたと思います。私はkeypathsと関係があると信じていますが、私は間違っているかもしれません。本当に長い入れ子になったメソッド呼び出しにある程度のスペースを節約すれば、私はちょうどdotメソッドを使います。 – pxl

答えて

17

私は新しいコードで見てきた大会は、プロパティのドットを使用することで、常には、メッセージ/セレクター(あなたが方法呼んでいるもの)のために、角括弧を使用します。ドットはObjective-C 2.0で導入されたので、オンラインで見つけた情報の不一致は全く予期しないことではありません。それはまだ、すべてのために角括弧を使用することも完全に可能だ(と私はを行う)

foo = [myObject backgroundColor]; 
[myObject setBackgroundColor:foo]; 

は繰り返しに

foo = myObject.backgroundColor; 
myObject.backgroundColor = foo; 

に相当し、あなたが使用するべきではありませんメッセージのドット、プロパティのみ。それは財産ではないので

があなたの特定の質問に答えるために、 [UIColor clearColor]は括弧に属します。実際には UIColor+(UIColor)clearColor)のクラスメッセージです。あなたはあなたのような音

は、Javaの世界から来たので、これが役に立つかもしれません:

MyObject *foo = [[MyObject alloc] initWithAwesome:YES]; /* MyObject foo = new MyObject(TRUE); */ 
[foo doSomethingWithNumber:5 andString:"five"];   /* foo.doSomething(5, "five"); */ 
MyColor *bar = foo.faceColor;        /* MyColor bar = foo.faceColor; */ 
MyColor *baz = [foo faceColor];       /* MyColor baz = foo.faceColor; */ 
foo.backColor = bar;          /* foo.backColor = bar; */ 
[foo setUndersideColor:baz];        /* foo.undersideColor = baz; */ 

「のsetXXX」と「XXX」のメッセージが合成された動的な性質から来る、とObjective-Cのイディオムです。 「ドット」は、単にそれらのメソッドを呼び出すための省略表現であり、おおよそ同等です。

EDIT:今、私はいくつかのupvotesを持っていることを、あなたのいくつかは再考する時間> :)

私はドットを使用することはありません、あなたがすべきでもありません。

+0

あなたはドット表記法の禁止の根拠を提供することができますか? – philsquared

+0

悪い、悪い、プログラマー! – pxl

+0

@ Phil Nash:コードをあまり明確にしません。括弧を見ると、何かが起きていることがいつもわかっています。私にとってのドットは、メッセージではなく割り当てのように感じます。私はBig Nerd Ranchのブログ記事を読む前にこの印象を受けました。彼らは私に同意します。それは悪い習慣を奨励する文法的な砂糖だけであり、働くプログラマーとして私は自分の習慣をきれいに保つことを知っています。私は括弧を怖がっていないが、一部の人々はそうであるように思われる。 –

0

うん、私はあまりにもこれを習い始め:他の言語とは異なり

、オブジェクトのメソッドを呼び出すための構文は次のとおり)(objName.someMethodではありません。

それは[objNameにのsomeMethod]

だ、ドット演算子がクラスのプロパティの値を取得または設定のいずれかに使用されています。それは何かをする短い方法です。

dot演算子は、オブジェクトのインスタンスでは常に使用され、[...]はオブジェクトのインスタンスまたは静的に(クラス名を使用して)使用できます。

todoTextLabelは、そうでなければ、などのパラメータを、提供しなければならない... []もが、ドット演算子を使用してちょうど短い手で使用することができ、それはただ長い表記法です。

これが役に立った。

3

Big Nerd Ranchは、ドット表記で読む価値があるsome thoughtsです。

rebuttalもあります。

+0

これは良い読み物であり、ドット表記を見たときに私が拾ったイディオムがBNRによって奨励されていることが分かりました。 –

+0

私は反論が必須の読み物であり、なぜドット記法が良いアイデアであるのかを明確にしていると思います。私は意図を隠すドット表記に同じ異論を抱いていました。私にはそれがより明確になりました。 –

2

プロパティアクセサーは、ゲッター用のインスタンス変数の後に名前が付けられたメソッドとして、セッター用に "set"がプレフィックスされた(大文字の)インスタンス変数名として書かれています。 fooとsetFooを持つ)。

Objective-C 2.0のように、object.fooを書くと、取得する場合は[object foo]メソッドに、設定する場合は[object setFoo:arg]にマップされます。どちらのフォームも使用できますが、Objective-C 2.0のみを使用している場合でも、完全なメソッド構文を好む人もいます。

Objective-C 2.0には、ゲッターとセッターを生成するための@ property/@ synthesize/@ dynamicキーワードが別にありますが、これに関連しています。これらを混ぜ合わせてドット表記法と組み合わせることができます。一方はドット表記法を必要としません。

for (Person *person in group.people){ ... } 

が第二ケースの可読性が一方で、モードを送信メッセージにあなたの脳を置くことによってinteruptedさで

for (Person *person in [group people]){ ... } 

よりも少し読みやすくなり、ので、私はプロパティのドット表記を使用

5

最初のケースでは、グループオブジェクトのpeopleプロパティにアクセスしていることは明らかです。コレクションを変更するとき

Iはまた、例えば、それを使用します:

[group.people addObject:anotherPerson]; 

もう少し可読ある

[[group people] addObject:anotherPerson]; 

、この場合に重点が追加のアクションであるべきであるより2つのメッセージを連結するのではなく、配列にオブジェクトを追加します。

+0

+1私は、人々が点と括弧について論じるとき、私はこの可読性の例が大半のものよりも好きです。私は一般的に括弧を使用して90%の時間を読みやすくしていますが、これは読みにくい場合の良い例です。 – Toby

関連する問題