Edited at

Objective-Cでの定数定義について

More than 3 years have passed since last update.

Objective-Cで定数を定義する方法を紹介します


定義方法


1. const


グローバル定数


Class.m

#import "Class.h"


const NSInteger kInt = 1;
const CGFloat kFloat = 10.f;
NSString *const kString = @"String";

@implementation Class

...

@end



Class.h

#import <Foundation/Foundation.h>


extern const NSInteger kInt;
extern const CGFloat kFloat;
extern NSString *const kString;

@interface Class : NSObject

...

@end



ローカル定数


Class.m

#import "Class.h"


static const NSInteger kInt = 1;
static const CGFloat kFloat = 10.f;
static NSString *const kString = @"String";

@implementation Class

...

@end



注意点

NSStringconst の位置に注意してください。

NSIntegerCGFloat と同じように

const NSString *kString = @"String";

と記述してしまうと、Objective-CではNSStringはオブジェクトなので、

const なNSStringオブジェクトへのポインタ となってしまいます。


2. Defineマクロ

#define INTEGER_VALUE 1

#define FLOAT_VALUE 10.f
#define STRING_VALUE @"String"


注意点


  1. 最後にセミコロンを記述しないようにしてください。

  2. こちらの方法は下記の理由により、個人的にはあまり推奨しません。


  • 型の指定がない

  • 同じ名前で定義してしまうと意図しないタイミングで定数置換が行われてしまう危険性がある


命名規則

定数の命名規則について紹介します


1. 先頭に k をつけ、単語の先頭の文字を大文字にする

Objective-Cで、1番よく見られる形です。

先頭の k はドイツ語の Konstant に由来するらしいです。

static const NSInteger kIntegerConstantValue = 1;


2. 先頭にプロジェクトの Class Prefix をつけ、単語の先頭の文字を大文字にする

enumで定義されている場合に、よく見られる形です。

static const NSInteger ABCIntegerConstantValue = 1;


3. 全て大文字で記述し、単語と単語の間に _ を入れる

C言語のDefineマクロで定義されている定数はこの形で記述されていることが多いですね。

僕もDefineマクロで定義しなくてはならない場合は、このように定義しています。

static const NSInteger INTEGER_CONSTANT_VALUE = 1;