我有一个常量NSString,想要这样调用:
[newString isEqualToString:CONSTANT_STRING];
这里有什么错误的代码吗?
我收到了这个警告:
将 'const NSString *' 发送到类型为 'NSString *' 的参数会丢弃限定符
应该如何声明这些变量?
我有一个常量NSString,想要这样调用:
[newString isEqualToString:CONSTANT_STRING];
这里有什么错误的代码吗?
我收到了这个警告:
将 'const NSString *' 发送到类型为 'NSString *' 的参数会丢弃限定符
应该如何声明这些变量?
你应该按照以下方式声明常量字符串:
NSString * const kSomeConstantString = @""; // constant pointer
改为:
const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";
前者是一个指向 NSString
对象的常量指针,而后者是一个指向常量 NSString
对象的指针。
使用 NSString * const
防止您重新分配 kSomeConstantString 指向另一个 NSString
对象。
isEqualToString:
方法需要一个类型为 NSString *
的参数。如果您传递一个指向常量字符串(const NSString *
)的指针,则传递的内容与其所期望的不同。
此外,NSString
对象已经是不可变的,因此将它们标记为 const NSString
是没有意义的。
const
这个修饰符作用于它左边的项,并且只有当它左边的项为空时,它才会作用于右边的项(例如,const char *
和 char const *
是指向常量字符的非常量指针,但 char *const
是指向非常量字符的常量指针)。 - user529758这里将来自 Stack Overflow 的各种帖子中对我有用的东西放在一起,#define 很糟糕,因为您无法从变量类型中受益,基本上编译器在编译时替换所有出现(每当需要时导入 Constants.h):
// Constants.h
#import <Foundation/Foundation.h>
@interface Constants : NSObject
extern NSString *APP_STATE_LOGGED_IN;
extern NSString *APP_STATE_LOGGED_OUT;
@end
// Constants.m
#import <Foundation/Foundation.h>
#import "Constants.h"
@implementation Constants
NSString *APP_STATE_LOGGED_IN = @"APP_STATE_LOGGED_IN";
NSString *APP_STATE_LOGGED_OUT = @"APP_STATE_LOGGED_OUT";
@end