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对象.
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)
我建议甚至使常量更具描述性.多边形边数的常数可以来自任何地方.作为一个建议,如何:
kDefaultsPolygonNumberOfSides;
Run Code Online (Sandbox Code Playgroud)
代替.
| 归档时间: |
|
| 查看次数: |
48336 次 |
| 最近记录: |