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;

}

然后我实例化我的类,并希望从此字典中自动设置 ivars。我实际上已经写了一些代码来检查这个参数是否存在,但是我在实际设置参数值时遇到了麻烦,特别是当参数是非对象(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

对于非对象参数,您必须将它们放入对象中,例如NSNumberor NSValue。然后,您可以将这些对象添加到您的字典中。

例如:

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