사용자 기본 설정을 저장하기 위해 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
” 이 생성 됩니다. 내 코드를 컴파일러 경고로부터 자유롭게 유지하고 싶습니다. 이 경고를 어떻게 수정할 수 있습니까?
답변
다음을 사용해야합니다.
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 = @"...";
답변
const
Objective-C 개체와 함께 사용하지 마십시오 . 실제로 사용하도록 설계되지 않았습니다. NSString
객체 (다른 많은 것 중에서)는 디자인으로 인해 기본적으로 이미 변경 불가능하므로 만들면 const
쓸모가 없습니다.
e.James가 제안 했듯이 .에 NSString * const
대한 상수 포인터 인를 사용할 수 있습니다 NSString
. 이것은 상수에 대한 포인터 인 const NSString *
(에 해당 NSString const *
) 와 미묘하게 다릅니다 NSString
. 를 사용하면 새 개체 를 가리 키도록 NSString * const
다시 할당 할 수 없습니다 .kPoly
NSString
답변
다른 클래스에서 액세스하려면 :
.h
extern NSString * const PolygonNumberOfSidesPrefsKey;
.미디엄
NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
현재 클래스 내에서만 액세스하려면 :
.미디엄
static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"
답변
상수를 더 설명 적으로 만드는 것이 좋습니다. 다각형의 변 수에 대한 상수는 어디에서나 올 수 있습니다. 제안 사항으로 다음과 같은 방법이 있습니다.
kDefaultsPolygonNumberOfSides;
대신.