15

@ avg、@sumなどの独自のキーパス演算子を定義することは可能ですか...</ p>

4

2 に答える 2

14

簡単な答え:ちょっと。オーバーライドvalueForKeyPath:してカスタム演算子をインターセプトしたり、に転送したりsuperできますが、問題が発生する可能性があります(説明は読者の練習問題として残しておきます)。

長い答え:はい、できますが、プライベート動作(プライベートAPIではない)の使用に依存しています。

のいくつかのきちんとした内省の後NSArray、私はいくつかのプライベートメソッドを見つけました:

_distinctUnionOfSetsForKeyPath:
_distinctUnionOfObjectsForKeyPath:
_distinctUnionOfArraysForKeyPath:
_unionOfSetsForKeyPath:
_unionOfArraysForKeyPath:
_unionOfObjectsForKeyPath:
_minForKeyPath:
_maxForKeyPath:
_countForKeyPath:
_avgForKeyPath:
_sumForKeyPath:

まあ、きちんと!これらのメソッドは、コレクション@sumで使用できる演算子、、、、などと一致しているようです。はアンダースコアに置き換えられ、追加されました。@min@max@distinctUnionOfObjects@ForKeyPath:

したがって、適切な署名に一致する新しいメソッドを作成できるように思われるので、準備は完了です。

それで:

@interface NSArray (CustomOperator)

- (id) _fooForKeyPath:(NSString *)keyPath;

@end

@implementation NSArray (CustomOperator)

- (id) _fooForKeyPath:(NSString *)keyPath {
  //keyPath will be what comes after the keyPath.  In this example, it will be "self"
  return @"Hello world!";
}

@end

NSArray * array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
NSLog(@"%@", [array valueForKeyPath:@"@foo.SELF"]); //logs "Hello world!"

動作しますが、将来変更される可能性のある実装の詳細に依存しているため、これに依存するかどうかはわかりません。

于 2010-11-04T21:08:11.903 に答える
0

valueForKeyPath:そこで独自のカスタムロジックをオーバーライドして実行することで可能ですが、フレームワークでサポートされていません。

于 2010-11-04T20:09:20.717 に答える