2009-07-10 8 views
7

NSSetに、メンバーをポーリングしてオブジェクトのそれぞれにNSIntegerというプロパティの合計を返すようにすばやく問い合わせる方法があると思っていましたが、これをMac OS X側のものと混同している可能性があります。これはCococa Touchに存在しますか?NSSet内のすべてのオブジェクトのプロパティを簡単に合計するには?

私が見つけることができる最も近いものはobjectEnumeratorです。これによって、私は各オブジェクトをライフルし、自分の変数を増やすことができます。より良い方法が存在するか?あなたはKVC準拠(theSet)だ配列/設定から派生したクラスの各メンバーのための指定されたプロパティ(theIntegerPropertyToSum)の合計を見つけようとしている場合は、次の操作を行うことができます

+0

あなたはNSArrayController arrangedObjects @ sumについて話していますか? ...もの?私はそれをNSSetとどのように接続するか、特定のクラスメンバーの数を取得する方法はわかりません...私はそれを読み上げる予定です。 – stefanB

答えて

15

NSNumber* theSum = [theSet valueForKeyPath:@"@sum.theIntegerPropertyToSum"]; 
+0

これは素晴らしいことです! btwは文書化されていますか?私はKVC Protocol Referenceの "valueForKeyPath:"の定義の中で何も見つけられないようです... – Meltemi

+0

これらはキー値コーディングのコレクション演算子と呼ばれ、ドキュメントは見つけにくいです... http:// developer .apple.com/library/ios /#documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html –

+0

このコードはメンテナンスには向いていません。 –

-3

普通の目的のC(2)を使わないのはなぜですか?

NSInteger theSum = 0; 
for (id obj in theSetOrArray) 
    theSum += obj.theIntegerPropertyToSum; 

欠点: あなたが行をカウントしたい場合、これは長くなります。他の短所はありますか?必要な 'theIntegerPropertyToSum'プロパティを持たないオブジェクトでKVCメソッドがどうなるのだろうか?

利点: 私はこのデバッグとパフォーマンステストが簡単だと思います。さらに、他の誰かがあなたのコードを1年か2年で読むと、ここで何が起こっているかを知ることができます。目標Cのラインを見たことがあるかどうかは、実際に起こっているようです。

+2

あなたの回答は、あなたがKVCのドキュメントを使用したり読んだりしていないことを意味しています。使用しないことを伝える前に読むことをお勧めします。 "単純な目的のC(2)"の例では、IntegerPropertyToSumが未定義であるか、またはIntegerPropertyToSumの値が-1で、別の値が1.2である場合はどうなりますか?もしそれが無ければ? –

+0

私はいつもUIをコードと通信させるためにKVCを使用します。 [theSet valueForKeyPath:@ "@ sum.theIntegerPropertyToSum]の欠点は、何が起こっているかを一目でわからない言語構造であることです。 valueForKeyPathステートメントを参照しているjavascript C、C#プログラマーは、それを理解できず、コードの1行が何であるかを知るために時間のかかるレッスンに惑わされます。必要な場合を除いて、言語固有の構造を使用しないでください。 STLの専門家を除くすべての人が読むことができないSTL C++コードを思い出させます。 –

+1

KVCではなく、常にKVOを使用しているようなサウンドです。 –

関連する問題