关于C#:“将’const NSString *’发送到’NSString *’类型的参数,丢弃限定符”警告

“sending 'const NSString *' to parameter of type 'NSString *' discards qualifiers” warning

我有常量nsstring,我想称之为:

1
[newString isEqualToString:CONSTANT_STRING];

这里有错误的代码吗?

我得到警告:

sending 'const NSString *' to parameter of type 'NSString *' discards qualifiers

这些应该如何申报?


您应该声明常量字符串如下:

1
NSString * const kSomeConstantString = @""; // constant pointer

而不是:

1
2
3
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就不好了,因为您无法从变量类型中获益,基本上编译器在编译时会替换所有出现的内容(import constants.h,无论何时需要):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//  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


抽出几分钟来读这个。指针上的goodread表示常量上的hell,反之亦然。

http://c-faq.com/decl/spiral.anderson.html网址: