「タイプ 'NSString *'のパラメーターに 'const NSString *'を送信すると、修飾子が破棄されます」警告


353

私は次のように呼び出したい定数NSStringを持っています:

[newString isEqualToString:CONSTANT_STRING];

ここに間違ったコードがありますか?

私はこの警告を受けました:

「const NSString *」をタイプ「NSString *」のパラメータに送信すると、修飾子が破棄されます

これらはどのように宣言する必要がありますか?


2
これらの文字列はどのように定義されていますか?

回答:


917

定数文字列は次のように宣言する必要があります。

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

の代わりに:

const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";

前者はNSStringオブジェクトへの定数ポインターであり、後者は定数NSStringオブジェクトへのポインターです。

a NSString * constを使用すると、別のNSStringオブジェクトを指すようにkSomeConstantStringを再割り当てできなくなります。

このメソッドisEqualToString:は、型の引数を予期していますNSString *。定数文字列(const NSString *)へのポインタを渡すと、予期したものとは異なるものを渡します。

また、NSStringオブジェクトはすでに不変であるため、オブジェクトを作成してconst NSStringも意味がありません。


3
前者はNSStringオブジェクトへの定数ポインターだとあなたは言った。つまり、ポインタは定数です。したがって、別のNSStringに再割り当てすることはできません。
user4951 '28 / 07/28

8
私はあなたに10票を与えることができるといいのですが!分かりやすく、非常に役立つ回答をありがとうございます。
コンスタンティーノサロウハ、2012年

1
どのようにNSString * constはNSStringへのconstポインタですか?彼らの文脈自由文法ジェネレータは何ですか?
user4951 2012

3
@ジム問題はあなたがCを適切に学んでいないことです、他人にそれを責めないでください。const修飾子は、その左側の用語に適用され、それがその左側には何も(例えばしかないのならば、その右側の用語に適用されていないconst char *char const *のconst char型への非constポインタであるが、char *const非constのcharへのconstポインタであります)。

8
+1。また、
Madbreaks、2014

6

stackoverflowのさまざまな投稿で見つかり、私のために機能する1つの場所にすべてを置くためだけに、#defineは変数型から恩恵を受けることができないため悪いです。

//  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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.