1

私は現在、ユーザーがいくつかのオブジェクトをセットアップするために使用している NSDictionnary でいくつかのパラメーターを定義するプロジェクトに取り組んでいます。たとえば、パラメーター param1=xxx、param2=yyy、gain=3.5 で Sound オブジェクトを作成するように要求できます。次に、パラメーター speed=10、active=YES、name=zzz で Enemi オブジェクトを作成します。

{
active = NO;
looping = YES;
soundList = "FINAL_PSS_imoverhere_all";
speed = 100.0;

}

次に、クラスをインスタンス化し、この辞書から ivar を自動的に設定したいと考えています。このパラメーターが存在することを確認するコードを実際にいくつか書きましたが、特にパラメーターがオブジェクトではない場合 (float または bool)、実際にパラメーター値を設定するのに問題があります。

これが私がこれまでにやっていることです:

    //aKey is the name of the ivar 
    for (NSString *aKey in [properties allKeys]){
        //create the name of the setter function from the key (parameter -> setParameter)
        NSString *setterName = [aKey stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[aKey substringToIndex:1] uppercaseString]];
        setterName = [NSString stringWithFormat:@"set%@:",setterName];
        SEL setterSelector =  NSSelectorFromString(setterName);
        //Check if the parameter exists
        if ([pge_object respondsToSelector:setterSelector]){
            //TODO : automatically set the parameter
        }
        else{
            [[PSMessagesChecker sharedInstance]logMessage:[NSString stringWithFormat:@"Cannot find %@ on %@", aKey, [dict objectForKey:@"type"]] inColor:@"red"];
            NSLog(@"Cannot find %@ on %@", aKey, [dict objectForKey:@"type"]);
        }
    }
}

ご覧のとおり、パラメーターがオブジェクトに存在することがわかったら、どうすればよいかわかりません。「performSelector... withObject...」を使用しようとしましたが、一部のパラメーターが非オブジェクト (float または bool) であることが問題です。また、setter を使用して、パラメーターのクラスを取得しようとしましたが、役に立ちませんでした。

誰かがそのようなことをすることができましたか?

4

2 に答える 2

3

ジャック・ローレンスのコメントは的を射ています。あなたが探しているのは、Key Value Coding、または単にKVCと呼ばれるものです。この Cocoa の基本的な部分により、インスタンス変数の名前を文字列として使用し、新しい値を使用して、任意のインスタンス変数を取得および設定できます。

オブジェクトのプリミティブ値への強制を自動的に処理するため、int および float プロパティにも使用できます。

値の検証と不明なプロパティの処理もサポートされています。

ドキュメントを参照してください

あなたのコードは、検証なしで書くことができます

for( id eachKey in props ) {
    [anOb setValue:props[eachKey] forKey:eachKey];
}

あるいは単に

[anOb setValuesForKeysWithDictionary:props];

ジャックが言ったように。

于 2012-11-28T17:29:57.277 に答える
0

オブジェクト以外のパラメーターについては、オブジェクトに配置する必要があります。たとえばNSNumber、 またはNSValueです。その後、これらのオブジェクトを辞書に追加できます。

例えば:

float f = 0.5;
NSNumber f_obj = [NSNumber numberWithFloat:f];
于 2012-11-28T17:29:09.513 に答える