5

最近、いくつかのドキュメントといくつかのブログ エントリを読み、Key-Value Coding非常に役立つことがわかりました。自分の場合に利用したいのですが、今のところ成功していません。

私の場合、NSMutableArray含む がにCGPoint変換されていNSValueます。このデータ配列に多くのポイントを追加し、x と y の最小値/最大値を取得したいと考えています。例えば:

NSMutableArray *data = [[NSMutableArray alloc] init];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(20.0f, 10.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(5.0f, -15.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(-5.0f, 20.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(15.0f, 30.0f)]];

// min X:  -5.0,  max X: 20.0
// min Y: -15.0,  max Y: 30.0

これまでに2つのアプローチがあります。1 つ目は、これら 4 つの値をクラス インスタンス変数に格納し、新しいオブジェクトが追加されたときにそれらの変数と比較し、必要に応じて更新することです。2 つ目は、極値を見つけるために for ループを使用しますが、このアプローチは非効率的です。

可能であれば、KVC を使用してこのタスクを実行したいと考えています。これは、私が持っているソリューションよりも一般的なソリューションになると思います。将来的には、配列からいくつかのオブジェクトを削除する必要が生じる可能性があります。これにより、最初のアプローチが適用できなくなり、for ループだけが残ります。

いくつかのキー パス、つまり を使用しようとしまし@"@max.x"@"@max.position.x"が、取得したのはNSUnknownKeyException.

4

2 に答える 2

9

カテゴリを使用してとの値にアクセスする方法を指定すると、機能する可能性があります。NSValuexyCGPoint

@interface NSValue (MyKeyCategory)
- (id)valueForKey:(NSString *)key;
@end

@implementation NSValue (MyKeyCategory)
- (id)valueForKey:(NSString *)key
{
    if (strcmp([self objCType], @encode(CGPoint)) == 0) {
        CGPoint p = [self CGPointValue];
        if ([key isEqualToString:@"x"]) {
            return @(p.x);
        } else if ([key isEqualToString:@"y"]) {
            return @(p.y);
        }
    }
    return [super valueForKey:key];
}
@end

それで

CGFloat maxx = [[yourArray valueForKeyPath:@"@max.x"] floatValue];

実際に動作します。ただし、特に , @max.x,@max.y@min.x4つの値すべてを計算する必要がある場合は、単純なループの方がはるかに高速であることに注意してください@min.y

于 2013-05-28T10:05:15.297 に答える