You are here: Home / TinBlog / NSArrayでお手軽に数値配列

NSArrayでお手軽に数値配列

Posted by h2 at Jul 25, 2013 11:05 PM |
Filed under:
Objective-C でよく利用する配列型クラスなんだけど、このNSArray、格納できるのはクラスインスタンスのみという制限がある。他にもnilが駄目だったりと、微妙にわがままなんだよね。おまけに、後から要素を追加したり、置き換えたりすることもできない。これはこれでメリットなんだけど…

「配列型クラスに、1〜5の整数を格納しておきたい」。

プログラムを組んでいると、こんな要求が、たまに出てくる。やり方として、まっとうな方法はというと、

 

1. 正攻法でプロパティを利用

数値を配列化したプロパティファイルを別に準備してやり、これから配列を起こす。

例えば、numbers.plist というファイルで、中身を

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
	<integer>1</integer>
	<integer>2</integer>
	<integer>3</integer>
	<integer>4</integer>
	<integer>5</integer>
</array>
</plist>

としたものを準備しておく。しかるのち、プログラム内から

	NSURL	*url = [[NSBundle mainBundle] URLForResource:@"numbers" withExtension:@"plist"]
	NSArray	*array = [NSArray arrayWithContentsOfURL:url];

という具合に読み込むことで、数値の入った配列が準備できる。

変動しうる数値情報をプログラム内にハードコードせずに済むなど、メリットも多い方法だし、普通はこれがおすすめ。

 

2.NSMutableArrayを利用して作成

正直、いかにもサボタージュな手法なんだけど、数値を変化させる予定がないだとか、とりあえずデバッグ目的で、なんて時に、つい使ってしまったりなんかしたりする。

具体的には、こんなコード。

	NSMutableArray	*array = [NSMutableArray array];
	for (int i = 1; i <= 5; i++) {
		[array addObject:[NSNumber numberWithInt:i]];
	}

これで、とりあえずは配列化した数値として機能する。

・・・・・・・・・・。

機能はするのだけど。実は、微妙に罪悪感。理由は Mutable を利用している点だったりする。

ちょびっと実行コストが高いんだよね、Mutable。詳しくは、ADCのリファレンス参照(とかいいつつ、現時点でADCのサイト落ちてマス orz)。

 

なんていうか、やっぱり Mutable でない NSArray で配列を扱いたいんだけど、かといって

	NSArray	*array = [NSArray arrayWithObjects:
					[NSNumber numberWithInt:1],
					[NSNumber numberWithInt:2],
					[NSNumber numberWithInt:3],
					[NSNumber numberWithInt:4],
					[NSNumber numberWithInt:5],
					nil];

のような、いちいち NSNumber が登場する、傍目にもダサいコードは組みたくないのですよ。

 

3. NSNumber をハードコードして配列を作成

というわけで、本命のこちら。サボりの王道的プログラムな訳だけど、

	NSArray	*array = [NSArray arrayWithObjects:@1, @2, @3, @4, @5, nil];

・・・みたいな。

つまり。ソースコード上で文字列を直接打ち込みたい場合などは、@"string" のように@マークを頭に付けることで、文字列を NSString (正確にはCFStringRefになるんだけど、同じものと言うことで)として宣言することができる。

同じ要領で、数字の直前に @ を付けてやることで、この数字は CFNumberRef となり、結果、直接 NSArray にぶち込めるようになるわけですね。

もちろん、小数もウェルカムでございます。

 

・・・いやあ。サボりっていいねぇ (笑

Filed under:
« June 2019 »
June
SuMoTuWeThFrSa
1
2345678
9101112131415
16171819202122
23242526272829
30