回答:
定数文字列は次のように宣言する必要があります。
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
も意味がありません。
const
修飾子は、その左側の用語に適用され、それがその左側には何も(例えばしかないのならば、その右側の用語に適用されていないconst char *
とchar const *
のconst char型への非constポインタであるが、char *const
非constのcharへのconstポインタであります)。
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
これを読むのに数分時間を割いてください。定数のポインタ地獄の良い読み、そしてその逆。