読者です 読者をやめる 読者になる 読者になる

忘備録

日々の調べ物をまとめる。アウトプットする。基本自分用。

【Objective-C】staticな定数なNSArray

Objective-C

を作ろうとして、NSStirngと同じように定義したらXcodeに怒られた。

// hoge.h
extern NSArray * const kHoge;

//hoge.m
NSArray * const kHoge = @[@"hoge", @"fuga"];

Xcodeさん「Initializer element is not a compile-time constant」

2012-07-04 - Kazzzの日記

どうやらNSStringの要領では出来ないらしい。。。

いろいろそれっぽいやり方は出てきたけど、下記のやり方が一番しっくりくるような気がする。

iOS:配列の定数をつくりたい。 - 舞台裏メモ記

How do I declare an array as a constant in Objective-c? - Stack Overflow

(2) Declare a convenient class method that returns the array, then use a static NSArray *myArray within that method and treat it as a singleton (search SO for "objective-c singleton" for about a zillion answers on how to instantiate).

ほかにシンプルで良い方法ないのかな。。。

2015/10/20 追記

NSArrayは諦めて、Cの配列を使うことにした。。。

iPhone - objective-cで (const修飾子で) 配列を定数としたいとき - Qiita

どうやらCの配列の要素を取得するのは結構面倒らしくて、 上記の参考にさせていただいたサイトでは配列の要素数も定数にて定義していた。

どうにか要素数の定義を省けないかとググってみたところ、 下記のサイトに配列の要素数を取得するマクロが紹介されていたので拝借しました。

配列の要素数の取得方法 | 闇夜のC++

HogeArrayConst.h

#import <Foundation/Foundation.h>

/**
 配列のサイズを取得するマクロ
 */
#define GET_ARRAY_SIZE(a)   (sizeof(a)/sizeof(a[0]));

@interface HogeArrayConst : NSObject

extern NSString *const HOGE_FUGA_PIYO[3];

@end

HogeArrayConst.m

#import "HogeArrayConst.h"

@implementation

NSString *const HOGE_FUGA_PIYO[] = {@"hoge", @"fuga", @"piyo"};

@end

利用時

#import "HogeArrayConst.h"

/*---------------略---------------------*/

- (void)hogeMethod {

    int arraySize = GET_ARRAY_SIZE(HOGE_FUGA_PIYO);
    for(int i=0; i<arraySize; i++) {
        NSLog(@"%@", HOGE_FUGA_PIYO[i]);
    }
}