0

NSDictionnary の使用中に奇妙な問題が発生しています ...

メソッド objectForKey を使用して辞書に存在するキーのオブジェクトを取得しようとしていますが、代わりに nil が返されます。

辞書全体を印刷すると、探しているキーと値がはっきりとわかります。

コードは次のとおりです。

- (MObject *)GetWithMProperty:(MProperty *)prop {
    NSLog(@"We search an object for a property named %@", prop.Name);
    NSArray *keyArray =  [_dict allKeys];
    int count = [keyArray count];
    for (int i=0; i < count; i++) {
        MObject *tmp = [_dict objectForKey:[ keyArray objectAtIndex:i]];
        NSLog(@"Key = %@ | Object = %d", ((MProperty*)[keyArray objectAtIndex:i]).Name, tmp.GetTypeId);
        if (prop == [keyArray objectAtIndex:i])
            NSLog(@"Wouhou !");
        else
            NSLog(@"Too bad :(");
    }
    return [_dict objectForKey:prop];
}

そしてスタックトレース:

2012-10-29 11:24:07.730 IOS6[1451:11303] We search an object for a property named Value
2012-10-29 11:24:07.730 IOS6[1451:11303] Key = Name | Object = 4
2012-10-29 11:24:07.731 IOS6[1451:11303] Too bad :(
2012-10-29 11:24:07.731 IOS6[1451:11303] Key = Value | Object = 0
2012-10-29 11:24:07.732 IOS6[1451:11303] Too bad :(

少し複雑です。J2ObjC を使用して完全に機能するエンジンをコンパイルしているため、クラス MProperty および MObject (エンジンによって使用される) を変更できません。

MProperty は NSCopying プロトコルに準拠していないため、MProperty を継承してプロトコルに準拠する IPhoneMProperty というクラスを作成しました。

これがこのクラスです:

@implementation IPhoneMProperty

- (id)initWithMProperty:(MProperty *)prop {
    self = [super initWithInt:prop.OwnerTypeId withNSString:prop.Name withInt:prop.TypeId withMBasicValue:prop.DefaultValue withInt:prop.Flags];
    return self;
}

- (id)copyWithZone:(NSZone *)zone {
    IPhoneMProperty *prop = [[IPhoneMProperty alloc] initWithMProperty:self];
    return prop;
}

@end

そして、辞書にオブジェクトとキーを追加するために使用する方法:

- (void)SetWithMProperty:(MProperty *)prop withMObject:(MObject *)obj {
    IPhoneMProperty *tempKey = [[IPhoneMProperty alloc] initWithMProperty:prop];
    [_dict setObject:obj forKey:tempKey];
}

私はそれが十分に明確であることを願っています.実際には、それが現時点で見つけた唯一の解決策ですが、うまくいきません:(

誰でもこれで私を助けることができますか?

ありがとう !

4

3 に答える 3

1

問題はラインに存在します

    if (prop == [keyArray objectAtIndex:i])

代わりに、クラスisEquals:にメソッドを実装してください。MProperty

-(BOOL)isEquals:(MProperty*)inProp {
  if( [inProp.name isEqualToString:self.name] )return YES;

  return NO;
}

そして、ここでは、行の代わりに

    if (prop == [keyArray objectAtIndex:i])

次の行を使用します。

    if ([prop isEquals [keyArray objectAtIndex:i]])
于 2012-10-29T10:46:04.840 に答える
0

使用する前に_dictオブジェクトを割り当てましたか?

次のようにコードを変更して確認します。

- (void)SetWithMProperty:(MProperty *)prop withMObject:(MObject *)obj {
    IPhoneMProperty *tempKey = [[IPhoneMProperty alloc] initWithMProperty:prop];
    if(!_dict) 
        _dict = [[NSMutableDictionay alloc]init];
    [_dict setObject:obj forKey:tempKey];
}

それがあなたのために働くことを願っています。

于 2012-10-29T10:46:20.997 に答える
0

if 条件を変更して、string 値を比較してみてください。このような :

if ([prop.Name isEqualToString:((MProperty*)[keyArray objectAtIndex:i]).Name])
            NSLog(@"Wouhou !");
        else
            NSLog(@"Too bad :(");
    }
于 2012-10-29T10:51:04.657 に答える