0

意図しないコア データ値の変更に問題があります。私はそれを修正する方法について考えていますが、それを行うたびに、認識されないセレクターが表示されます。私の考えは、に変更valueArray = attribute.values;するvalueArray = [NSArray arrayWithArray:attribute.values];ことです。

編集: attribute.values の合計を作成しようとしています。スキルノードがあり、それぞれに属性が関連付けられていますが、それらの属性値が異なる場合があります。同様の値をすべて合計しようとしています。

    Build *selectedBuild = [buildListController selectedObjects][0];
    NSMutableDictionary *attributeAggregator = nil;
    attributeAggregator = [NSMutableDictionary dictionary];
    NSLog(@"Before: %@", attributeAggregator);
    NSMutableDictionary *numValues = [NSMutableDictionary dictionary];
    NSArray *valueArray = nil;

    for (SkillNode *active in selectedBuild.activeNodes) {
        for (Attribute *attribute in active.attributes) {
            NSString *attrName = attribute.name;
            NSLog(@"%@ %@", attribute.name, attribute.values);
            NSMutableArray *obj = [attributeAggregator objectForKey:attribute.name];
            if (obj) {
                for (int ndx = 0; ndx < [obj count]; ndx++) {
                    obj[ndx] = [NSNumber numberWithFloat:([obj[ndx] integerValue] + [attribute.values[ndx] integerValue])];
                }
                [attributeAggregator setValue:obj forKey:attrName];
            } else {
                valueArray = attribute.values;
                [attributeAggregator setValue:valueArray forKey:attrName];
                [numValues setValue:attribute.numValues forKey:attrName];
            }
        }
    }
4

3 に答える 3

0

attribute.values をディクショナリに追加する前に NSArray に入れる代わりに、単に attributes.values をディクショナリに追加してみませんか?

これが私が話していることです:

...
valueArray = attribute.values;
[attributeAggregator setValue:valueArray forKey:attrName];
...

それを次のように変更します。

...
[attributeAggregator setValue:attribute.values forKey:attrName];
...

お役に立てれば。

于 2013-01-07T15:45:49.613 に答える
0

attribute.values の mutableCopy を作成し、それを辞書に格納することで解決しました。

于 2013-01-08T00:22:07.493 に答える
0

このコードは恐ろしいものです。

if (obj) {
    for (int ndx = 0; ndx < [obj count]; ndx++) {
        obj[ndx] = [NSNumber numberWithFloat:([obj[ndx] integerValue] + [attribute.values[ndx] integerValue])];
    }
[attributeAggregator setValue:obj forKey:attrName];

あなたはそれを反復しobj、同時に突然変異させています。これは危険であり、眉をひそめています。これが、これを行うとループの高速列挙がコンパイルされない理由です。

KVC Collection Operatorsを使用して合計を取得することを確認してください。データ構造がどのように表示されるかについては十分に明確ではありませんが、具体的にはドキュメントを見てください@sum

RE: コメント

わかりました、あなたが何をしているのか正確にはわかりませんでした。コレクション演算子はここでは役に立ちません。ただし、配列を反復処理しているため、配列を変更することはありません。おそらく、2 つの配列を新しい配列に追加し、完成した配列を必要な場所に設定します。3 番目の結果配列を使用して 2 つの配列を合計する例...

NSArray *foo = @[@1, @2, @3];
NSArray *bar = @[@4, @5, @6];

NSMutableArray *result = [NSMutableArray arrayWithCapacity:[foo count]];

[foo enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
   result[idx] = [NSNumber numberWithInt:[obj integerValue] + [bar[idx] integerValue]];
}];

// result == @[@5, @7, @9]
于 2013-01-08T01:09:08.287 に答える