상수 NSString을 NSUserDefaults의 키로 사용


86

사용자 기본 설정을 저장하기 위해 NSUSerDefaults를 사용하고 있습니다. 나는 어딘가에서 키를 상수로 설정하는 것이 좋은 생각이라는 것을 읽은 것을 기억하며 동의합니다. 다음 코드는 현재 내가 가지고있는 것입니다.

[[NSUserDefaults standardUserDefaults]
        setObject:[NSNumber numberWithInt:polygon.numberOfSides] 
           forKey:@"polygonNumberOfSides"];

이것을 다음과 같이 변경하려고 시도했습니다.

@implementation Controller

NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";

-(void)savePolygonInfo {
    [[NSUserDefaults standardUserDefaults]
            setObject:[NSNumber numberWithInt:polygon.numberOfSides] 
               forKey:kPolygonNumberOfSides];
}

작동하는 동안 " warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type" 이 생성 됩니다. 내 코드를 컴파일러 경고로부터 자유롭게 유지하고 싶습니다. 이 경고를 어떻게 수정할 수 있습니까?

답변:


207

다음을 사용해야합니다.

NSString * const kPolygonNumberOfSides = @"..."; // const pointer

대신에:

NSString const * kPolygonNumberOfSides = @"..."; // pointer to const

첫 번째는 NSString 객체에 대한 상수 포인터이고 두 번째는 상수 NSString 객체에 대한 포인터입니다.

미묘한 차이입니다. setObject:forKey:다음과 같이 선언 되기 때문에 컴파일러 경고가 발생 합니다.

- (void)setObject:(id)value forKey:(NSString *)defaultName;

defaultName인수가 유형일 것으로 예상하고 있습니다 NSString *. 대신 상수에 대한 포인터를 전달하면 다른 값을 지정한 것입니다.

업데이트 : 이러한 상수는static단일 파일 내에서만 사용되는 것처럼정의되어야한다는 점을 지적하고 싶습니다. 이 문제를 직접 겪었 기 때문에 이렇게 말합니다. 정적으로 선언하지 않으면 전역 네임 스페이스에 존재하며 다른 파일에서 동일한 이름의 변수를 사용할 수 없습니다. 자세한 내용 은 Objective-C의 상수 를 참조하십시오. 예를 들어 설명하기 위해 현재 하나의.m파일에서만 사용해야하는 키에 대해 다음을 사용합니다.

static NSString * const kSomeLabel = @"...";

1
NSString * const fooNSString불변하고 포인터가 불변 하기 때문에 작동하므로 결코 올바르게 변경할 수 없습니까? 또한 const암시 적으로 static(컴파일러 최적화) C ++ 에서 호출 할 필요가 없습니다. 여기에서도 마찬가지입니까?
Ternary

32

constObjective-C 개체와 함께 사용하지 마십시오 . 실제로 사용하도록 설계되지 않았습니다. NSString객체 (다른 많은 것 중에서)는 디자인으로 인해 기본적으로 이미 변경 불가능하므로 만들면 const쓸모가 없습니다.

e.James가 제안 했듯이 .에 NSString * const대한 상수 포인터 인를 사용할 수 있습니다 NSString. 이것은 상수에 대한 포인터 인 const NSString *(에 해당 NSString const *) 와 미묘하게 다릅니다 NSString. 를 사용하면 새 개체 를 가리 키도록 NSString * const다시 할당 할 수 없습니다 .kPolyNSString


const 사용에 대한 좋은 점. 이것이 많은 Objective-C 클래스에 "Mutable"변형이있는 이유입니다.
e.James 2009

2
그것은 const또한 당신이 그것을 재 할당 할 수 없다는 것을 의미 한다고 생각 했습니다. 내가 잘못한 것 같아요.
Dan Rosenstark

18

다른 클래스에서 액세스하려면 :

.h

extern NSString * const PolygonNumberOfSidesPrefsKey;

.미디엄

NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"

현재 클래스 내에서만 액세스하려면 :

.미디엄

static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"

5

상수를 더 설명 적으로 만드는 것이 좋습니다. 다각형의 변 수에 대한 상수는 어디에서나 올 수 있습니다. 제안 사항으로 다음과 같은 방법이 있습니다.

kDefaultsPolygonNumberOfSides;

대신.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.