1

Cocoa プロジェクトにオブジェクトの配列があります。オブジェクトが渡された値と一致する属性を持っている場合、オブジェクトはメソッドの戻り値である新しい配列に保存する必要があります。これは非常に単純なようですが、奇妙な動作が見られます。メソッドは次のとおりです。

- (NSMutableArray*)tagAttributeRectsForID:(NSString*)nodeID
{
    NSMutableArray * resultArray = [NSMutableArray array];
    for (NSDictionary * line in self.lineInfoForTap) {

        NSMutableArray * glyphRects = [line valueForKey:@"GlyphRects"];

        for (NSDictionary * rectDict in glyphRects) {
            if ([rectDict valueForKey:nodeID]) {
                CGRect thisRect = CGRectFromString([rectDict valueForKey:nodeID]);
                if (thisRect.size.width > 0) {
                    [resultArray addObject:NSStringFromCGRect(thisRect)];
                }

            }
        }
        glyphRects = nil;
    }
    return resultArray;
}

何が起こるかは、一連の一致をもたらす行オブジェクトの数に応じて、返される配列で結果の完全なセットを取得する回数です。言い換えれば、標本の結果は次のようになると思います。

2013-04-16 19:38:37.665 Vorpal[18523:c07] (
"{{0, 486.5}, {38.44, 13.5}}",
"{{100, 486.5}, {27.12, 13.5}}",
"{{140, 483.34}, {86.54, 16.66}}",
"{{0, 508.86}, {58.62, 14.14}}"
)

しかし、代わりに私はこれを取得します:

2013-04-16 19:38:37.665 Vorpal[18523:c07] (
"{{0, 486.5}, {38.44, 13.5}}",
"{{100, 486.5}, {27.12, 13.5}}",
"{{140, 483.34}, {86.54, 16.66}}",
"{{0, 508.86}, {58.62, 14.14}}",
"{{0, 486.5}, {38.44, 13.5}}",
"{{100, 486.5}, {27.12, 13.5}}",
"{{140, 483.34}, {86.54, 16.66}}",
"{{0, 508.86}, {58.62, 14.14}}"
)

3 行分の一致結果があった場合、3 セットのデータが返されます。

このメソッドをコーディングした方法について、非常に基本的な何かが欠けていると思わずにはいられませんが、何時間も見つめた後、タオルを投げて友人に尋ねる準備ができています. あなたはその友人、匿名の SO 読者ですか? 私は友達を使うことができました。:-(

4

1 に答える 1

4

結果に重複がある場合 (重複している場合)、ソース データに重複があると推測する必要があります。NSSet を使用して重複をフィルタリングできます。

気があれば、このコードを大幅に圧縮できます。その後、明示的にセットを作成する必要はありません。

最初に NSString でカテゴリを作成します。

@interface NSString (ValidStringRect)
- (BOOL)validRect { return CGRectFromString(self).size.width > 0; }
@end

次に、メソッドを次のように置き換えます。

- (NSMutableArray*)tagAttributeRectsForID:(NSString*)nodeID
{
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"validRect = YES"];
    // I might have the @distinctUnionOfArrays operator at the wrong point in the keypath
    id array = [self valueForKeyPath:[NSString stringWithFormat:@"lineInfoForTap.GlyphRects.@distinctUnionOfArrays.%@", nodeID]];
    return [[array filteredArrayUsingPredicate:pred] mutableCopy];
}

キー「@distinctUnionOfArrays」は配列演算子であり、これがないと配列の配列になります。詳細については、 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.htmlを参照してください。

于 2013-04-17T19:52:28.940 に答える