我正在使用 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 *
。当您传递一个指向常量的指针时,您就给了它一些不同的东西。
Update:我想指出这些常量应该定义为static
如果它们仅在单个文件中使用。我这么说是因为我自己也遇到过这个问题:如果你不将它们声明为静态,那么它们将存在于全局命名空间中,并且你将无法在另一个文件中使用同名的变量。看Objective-C 中的常量 https://stackoverflow.com/questions/538996/constants-in-objective-c了解更多信息。举例来说,这就是我目前使用的密钥,我只需要在一个中使用.m
file:
static NSString * const kSomeLabel = @"...";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)