web-dev-qa-db-ja.com

Objective-cのドット表記または角括弧表記では何が好ましいですか?

私は本を​​読んでいます-Big Nerd Ranch iOSプログラミング。ドット表記はコードを難読化するため、推奨されていません。私は同時にiOSプログラミングのスタンフォードコースを見ています。その中で彼はそこでドット表記法を広く使用しています。あなたは何をお勧めします?個人的にはもっとブラケット表記に傾いています。

このコードをブラケット表記に変換する方法を説明してもらえますか?

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

私が理解しているように、それは:

[[self display] setText]:[[[self display] text] stringByAppendingString:digit];

それが正しいか?

34
Dvole

これは個人的な選択の問題です。 Cスタイルの構造要素へのアクセスのように見えるので、ドット表記はメッセージが送信されている(メソッドが呼び出されている)ことを不明確にすると主張する人がいます。反対の意見は、ドット表記は入力が簡単で、読みやすく、簡潔であるということです。

(Objective-C 2.0で)ドット表記が導入される前からObjective-Cを書いている人として、私は両側の議論を理解できますが、自分でドット表記を使用することを好みます。とは言っても、Objective-Cで始まる人は、ドット表記構文がコンパイル時に標準のアクセサーメソッド呼び出しに変換されることを理解することが重要だと思います。ビッグ・ナード・ランチの本の著者はおそらく同じような態度を持っていると思います、そしてそれが彼らが本でブラケット表記を使用することに決めた理由の大きな部分です。

要するに、あなたが一番好きなことをしてください。どちらも有効であり、2つの間の選択は基本的にスタイルの問題です。どちらを選択する場合でも、どちらのスタイルでも同等のコンパイル済みコードが生成されることを理解してください。

編集:ドット表記をブラケット構文に変換することについての質問に答えるのを忘れていました。あなたは近いですが、あなたが書いたものは間違っており、実際にはコンパイルされません。そのはず: [[self display] setText:[[[self display] text] stringByAppendingString:digit]]。私がそれを書いていたら、2行に分割します(まあ、実際にはドット表記を使用します)。

NSString *stringWithDigit = [[[self display] text] stringByAppendingString:digit];
[[self display] setText:stringWithDigit];

編集2:私がこの回答を書いてから3年以上になります。最近、もっと多くのAppleフレームワーククラスに、以前は通常のメソッドであったプロパティが@propertiesに変換されました(-[NSArray count])おそらくより良いSwift interop。これにより、以前よりも自由にドット表記を使用するようになりました。

56
Andrew Madsen

これが私の意見です。

プロパティを扱う場合は、常にドット表記を使用する必要があります。書くのが速いだけでなく(self.fooの文字数は[short foo]よりも少ない)、さらに重要なことに、チェーンメッセージが理解しやすくなります。例えば:

self.myTextField.text.length

よりも理解しやすいです

[[[self myTextField] text] length]

さらに、句読点がめちゃくちゃになる可能性が低くなります(正しい数の角かっこがあることを確認することは、多くの場合面倒です)。

しかし、他の人々が上で述べたように、最終的にそれは個人的な意見です。

11
Nosrettap

私はこれが古い投稿であることを知っていますが、もっと現代的な答えを追加したいと思います。

Swiftのリリースと私たちのお気に入りの言語の差し迫った終焉により、設定はドット表記に傾くはずです。すべてのiOSフレームワークは、ドット表記を優先するようにAPIを更新しました(ヘッダーの読み取り専用プロパティをこれにより、最終的にSwiftより流動的になります。

明確にするために、ゲッターやセッターを公開しているインスタンスのプロパティを優先します。幸運なことに、Xcodeの 現代の目的-c移行ツール がこれのほとんどを行います。

6
Daniel Galasko