2012-12-25 2 views
1

나는 사용하지 않고 지금은 내가 정의한 상수와 같은 이름을 가진 일부 키, 나는 상수의 값을 인쇄하려면 한아이폰 : 액세스 상수 값

#define val_a @"A" 
#define val_b @"B" 
#define val_c @"C" 

(같은 몇 가지 상수를 정의했다 상수 키). 모든 키가 동적으로 내가 NSLog(@"Value = %@", [self actualValForKey:keys]);처럼 쓸 수

- (NSString *) actualValForKey:(NSString *)key 
{ 
    return key; //It will return **key** parameter, but I want to return the **constant value** as defined 
} 

나는 시도했다, 나는 이런 식으로 NSLog(@"Value = %@", val_a);을 쓸 수 없습니다.

여기에서 keysNSString으로 올 것입니다.

P. 상수 식별.

가능합니까? 대안?

+0

설명 할 수 있습니까? –

+0

keys = val_a; NSLog (@ "값 = % @", [self actualValForKey : keys]); –

+0

질문을 더 명확하게 편집했습니다. 나는 어떤 열쇠가 사용 될지 모른다, 모두 동적으로 올 것이다. – Hemang

답변

0

이 문제를 조사해 주셔서 감사합니다. 드디어 초심자 답게 해결책을 찾았습니다. ;)

- (NSString *) actualValForKey:(NSString *)key 
{ 
    NSString *str = @""; 

    if([key isEqualToString:val_a]) 
    { 
     str = @"A"; 
    } 
    else if([key isEqualToString:val_b]) 
    { 
     str = @"B"; 
    } 
    . 
    . 
    return str; 
} 

P. #define과 동일한 이름으로 업데이트해야합니다 (상수는).

1

C++/ObjectiveC에서는 런타임에 매크로의 이름을 가져올 수 없습니다. 때문에 매크로 이름은 매크로 본문의 복사본으로 대체됩니다.

당신은 문서 마치 #define 지시어는 일반적으로 상수, 키워드와 의미 식별자를 연결하는 데 사용됩니다 here

읽을 수

, 일반적는 문이나 표현을 사용했다. 상수를 나타내는 식별자는 종종 "상징 상수"또는 "적하 목록 상수"라고합니다. 이 문이나 표현식을 나타내는 식별자를 "매크로"라고합니다. 이 전 처리기 설명서에서는 "매크로"라는 용어 만 사용됩니다. 매크로의 매크로가 프로그램 소스 텍스트 나 다른 사전 처리기 명령의 인수에서 인식되면 해당 매크로를 호출로 처리합니다. 매크로 이름은 본문의 복사본으로 대체됩니다. 매크로가 인수를 받아들이면 본문 뒤에있는 실제 인수가 매크로 본문의 형식 매개 변수로 대체됩니다. 매크로 호출을 의 처리 된 복사본으로 바꾸는 프로세스를 매크로 호출의 "확장"이라고합니다.

하지만 정말로 필요한 경우. 파일에 모든 #define 지시문을 구문 분석하고 NSDictionary를 작성하는 빌드 스크립트를 작성할 수 있습니다. 코드에서 사용할 수 있습니다.

예를 들어 파일을 추가했습니다. 어떤 스크립트의 올바른 사용법을 보여줍니다.

enter image description here

0

당신이 keys=val_aval_a gets는 @로 "A"를 대체하고는 @ "A"메소드로 전송 쓰기로이 즉시 전처리이다.

명명 규칙에 따라 모든 매크로는 블록 이름이어야하며 변수에 같은 이름이 붙지 않아야합니다.

#define VAL_A @"A" 
#define VAL_B @"B" 
#define VAL_C @"C" 

또는 비슷한 일을해야하는 경우가 된 KeyValues의 모든 설정과 사전을 만들 수 있습니다.

편집 : 당신이 다음 정의를 사용하는 경우

는 문자열로 전달 된 값을 변환하고 당신은 키를 저장할 수 있습니다.

#define RET_NAME(n) #n 

NSString *key=[NSString stringWithFormat:@"%s", RET_NAME(val_a)]; 

이제 keyval_a를 저장합니다.

0

나는 이름과 값을 다음과 같이 분리한다. #defines 또는 const 문자열을 사용하여 사물의 이름을 정의한 다음 실제 값을 사전에 채운다. 그 이유는 평범한 #define보다 더 나은 가치를위한 외부 소스로의 마이그레이션에도 불구하고 생존 할 수 있기 때문입니다. 또한 그것은, (이 커프 꺼짐) 당신은에 일관성 검사의 모든 종류의 작업을 수행하는 모든 예상 키가 등등하다 어떠했는지 값이 존재 어떠했는지를 확인할 수 있습니다

#define kNameForThing 
#define kNameForOtherThing 

- (void) initValues { 
    // _defaults is a NSDictionary 
    _defaults = @{ 
     kNameForThing : @"A", 
     KNameForOtherThing : @"B" 
    }; 
} 

- (void) useValue { 
    NSString value = _defaults[kNameForThing]; 
    .... 
} 

예를 들어 NSUserDefaults 같은 다른 방법으로도 재생 파일에서이 정보를로드하면 더 중요해진다.

더 많은 표현 이름을 사용하면 장기적으로 도움이 될 것입니다. 더 쉬운 객체 생성 및 액세스를 위해 새로운 목표 C 리터럴 구문을 사용합니다.