使用常量NSString作为NSUserDefaults的键

Oll*_*lly 85 cocoa objective-c default-value

我正在使用NSUSerDefaults存储用户首选项.我记得在某处将键设置为常量是一个好主意 - 我同意.以下代码是我目前拥有的代码:

[[NSUserDefaults standardUserDefaults]
        setObject:[NSNumber numberWithInt:polygon.numberOfSides] 
           forKey:@"polygonNumberOfSides"];
Run Code Online (Sandbox Code Playgroud)

我尝试将其更改为:

@implementation Controller

NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";

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

虽然这确实有效,但它会产生" warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type".我很想让我的代码免受编译器警告的影响.我该如何修复此警告?

e.J*_*mes 205

你应该使用:

NSString * const kPolygonNumberOfSides = @"..."; // const pointer
Run Code Online (Sandbox Code Playgroud)

代替:

NSString const * kPolygonNumberOfSides = @"..."; // pointer to const
Run Code Online (Sandbox Code Playgroud)

第一个是指向NSString对象的常量指针,而第二个是指向常量NSString对象的指针.

这是一个微妙的差异.发生编译器警告,因为setObject:forKey:声明如下:

- (void)setObject:(id)value forKey:(NSString *)defaultName;
Run Code Online (Sandbox Code Playgroud)

期待defaultName论证是类型的NSString *.当你改为传递指向常量的指针时,你已经给它了不同的东西.

更新:我想指出这些常量应该定义为static只在单个文件中使用它们.我这样说是因为我自己遇到了这个问题:如果你没有将它们声明为静态,那么它们将存在于全局命名空间中,并且你将无法在另一个文件中使用具有相同名称的变量.有关详细信息,请参阅 Objective-C中的常量.为了通过示例解释,这是我目前用于我只需要在一个.m文件中使用的密钥:

static NSString * const kSomeLabel = @"...";
Run Code Online (Sandbox Code Playgroud)


Ada*_*eld 32

不要const与Objective-C对象一起使用,它们实际上并不是为了使用它而设计的. NSString对象(以及许多其他对象)由于其设计而默认已经不可变,因此使它们const无用.

正如e.James建议的那样,你可以使用a NSString * const,它是一个常量指针NSString.这与a const NSString *(等效于NSString const *)略有不同,它是指向常量的指针NSString.使用a NSString * const可防止您重新分配kPoly以指向新NSString对象.

  • 我以为const也意味着您不能重新分配它。我想我错了。 (2认同)

mal*_*hal 15

从其他类访问:

.H

extern NSString * const PolygonNumberOfSidesPrefsKey;
Run Code Online (Sandbox Code Playgroud)

.M

NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSidesPrefsKey"
Run Code Online (Sandbox Code Playgroud)

仅限当前类内的访问:

.M

static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSidesPrefsKey"
Run Code Online (Sandbox Code Playgroud)


Abi*_*ern 5

我建议甚至使常量更具描述性.多边形边数的常数可以来自任何地方.作为一个建议,如何:

kDefaultsPolygonNumberOfSides;
Run Code Online (Sandbox Code Playgroud)

代替.