44
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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;
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
44
Help us understand the problem. What are the problem?