我目前正在开发一个项目,用户在NSDictionnary中定义一些参数,我用它来设置一些对象。 例如,您可以要求创建一个参数为param1 = xxx,param2 = yyy,gain = 3.5的Sound对象...然后是参数speed = 10,active = YES,name = zzz ...
{
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获取参数的类,但它没有帮助。
有没有人设法做那样的事情?
答案 0 :(得分:3)
杰克劳伦斯的评论很有见。 您正在寻找的是键值编码,或者只是 KVC 。 Cocoa的这个基本部分允许您使用其名称作为String和新值来获取和设置任何实例变量。
它会自动将对象强制处理为原始值,因此您也可以将它用于int和float属性。
还支持验证值和处理未知属性。
您的代码无需验证即可编写
for( id eachKey in props ) {
[anOb setValue:props[eachKey] forKey:eachKey];
}
或只是
[anOb setValuesForKeysWithDictionary:props];
杰克说。
答案 1 :(得分:0)
对于非对象参数,您必须将它们放入对象中,例如NSNumber
或NSValue
。然后,您可以将这些对象添加到字典中。
例如:
float f = 0.5;
NSNumber f_obj = [NSNumber numberWithFloat:f];