2012-11-28 1 views
1

현재 사용자가 NSDictionnary에서 일부 매개 변수를 정의하는 프로젝트에서 작업하고 있는데, 일부 개체를 설정하는 데 사용하고 있습니다. 예를 들어 매개 변수 param1 = xxx, param2 = yyy, gain = 3.5 ...를 사용하여 Sound 객체를 만들도록 요청할 수 있습니다. 매개 변수 speed = 10, active = YES, name = zzz ...set ivars from NSDictionnary

인 Enemi 객체 그때 내 클래스의 인스턴스를,이 사전도에서 자동으로 인스턴스 변수를 설정하려는

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

}. 실제로이 매개 변수가 있는지 확인하기 위해 일부 코드를 작성했지만 실제로 매개 변수 값을 설정하는 데 문제가 있습니다. 특히 매개 변수가 아닌 경우 (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를 사용하여 매개 변수의 클래스를 가져 오려고 시도했지만, 하지만 도움이되지 않았다.

사람이 그런 일을 할 관리 했습니까?

+2

'setValuesForKeysWithDictionary :'! –

+0

오! 나는 그 하나를 놓쳤다! 감사합니다. –

답변

0

를 사용하면 객체에 넣어해야하는 비 객체 매개 변수의 경우, 예를 NSNumber 또는 NSValue하십시오. 그런 다음 다음을 추가 할 수 있습니다 당신의 사전에 객체 예를 들어

:.

float f = 0.5; 
NSNumber f_obj = [NSNumber numberWithFloat:f]; 
3

잭 로렌스의 의견이 자리하고 있습니다. 찾고있는 것은 키 값 코딩 또는 KVC입니다. 코코아의 기본적인 부분은 이름을 문자열과 새 값으로 사용하여 인스턴스 변수를 가져오고 설정할 수있게합니다.

강제 변환 개체를 기본 값으로 자동 처리하므로 int 및 float 속성에도 사용할 수 있습니다.

값을 확인하고 알 수없는 속성을 처리하는 기능도 지원됩니다. 잭이 말한대로

see the docs

코드는 검증하지 않고,

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

또는
[anOb setValuesForKeysWithDictionary:props]; 

단지

을 작성할 수 있습니다.

+0

그래, 내가하고있는 일은 내가 (내가 구문 분석하고 싶지 않은 추가 정보가 dictionnary에 들어 있으므로) 유효성 검사 루프를 유지하고 TODO 주석이있는 줄에 다른 사전을 만드는 것이다. 그런 다음 setValuesForKeysWithDictionary와 함께 새 사전을 사용하고 있습니다. 매력처럼 작동합니다! –