我有一个常量NSString,我想调用它
[newString isEqualToString:CONSTANT_STRING];
这里有错误代码吗?
我得到了这样的警告:
发送'const NSString *'到类型为'NSString *'的参数,丢弃限定符
这些应该如何声明?
我有一个常量NSString,我想调用它
[newString isEqualToString:CONSTANT_STRING];
这里有错误代码吗?
我得到了这样的警告:
发送'const NSString *'到类型为'NSString *'的参数,丢弃限定符
这些应该如何声明?
当前回答
只是把所有的东西放在一个地方,在stackoverflow上的各种帖子上找到了,对我来说,#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
其他回答
抽出几分钟来读读这篇文章。指针很好用,常量很好用,反之亦然。
http://c-faq.com/decl/spiral.anderson.html
你应该这样声明你的常量字符串:
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是没有意义的。
只是把所有的东西放在一个地方,在stackoverflow上的各种帖子上找到了,对我来说,#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