変数のデータ型や文字列の扱いを理解しよう:Cocoaの素、Objective-Cを知ろう(4)(1/3 ページ)
iPhone用アプリケーション開発で注目を集める言語「Objective-C」。C++とは異なるC言語の拡張を目指したこの言語の基本を理解しよう(編集部)
プログラミング言語には、コーディングをしていくうえで必要となる定番要素があります。例えば、目的に応じた変数のデータ型、文字列を柔軟に扱う方法、配列やマップといったデータの集合を扱う仕組みなど、具体的なロジックを書く際に必要となる要素は、あらゆる言語に共通するものです。
今回から2回に分けて、そういった定番要素のObjective-Cにおける作法や特徴について解説したいと思います。
なお、今回と次回はロジックの書き方が説明の中心となりますので、サンプルプログラムは、main関数の中にすべてを記述する形で作成します。コンパイルと実行の方法については、第3回「Objective-Cのクラス定義を理解しよう」の冒頭の部分および第2回「一番初めのObjective-Cプログラム」のコンパイルに関する解説を参照してください。
※サンプルコード中の「#import <Foundation/Foundation.h>」は、Foundationフレームワークに含まれるヘッダファイル群をまとめてインポートするものです。前回までは利用したいクラスのヘッダファイルを個別にインポートしていましたが、利用するクラスが多岐にわたる場合は、Foundation.hでまとめてインポートすることができます。
※サンプルコードのmain関数の中の、「NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];」や「[pool drain];」の部分は、メモリ管理に関する処理になります。メモリ管理については連載の別の回で解説する予定ですので、取りあえずはお約束と思って関数の最初と最後に記述しておいてください。
変数のデータ型
Objective-CはC言語のうえに成り立っていますので、変数のデータ型も基本的なものはC言語に準じます。クラスオブジェクトは純粋なC言語にはない概念ですが、変数としてはC言語のポインタ(メモリ上の参照値)で保持されます。
変数の宣言や初期化は、以下のように記述します。
int myInt1; // 宣言のみ行う myInt1 = 1; // 宣言済みの変数に値を代入 int myInt2 = 3; // 宣言と同時に値を代入 double myDouble1, myDouble2; // 複数の変数をまとめて宣言
以下に、Objective-Cで利用可能なデータ型を整理してみましょう。
整数を表すデータ型
整数を扱うときは、int型の変数を利用します。int型の変数は、符号あり(ゼロと、正の値および負の値を扱う)の場合はsigned int(または単にint)、符号なし(ゼロと正の値のみを扱う)の場合はunsigned int(または単にunsigned)のように修飾子を指定して使い分けることができます。変数は型によってメモリ上のサイズ(つまりその変数で表現できる値の範囲)が決まっていますので、正の値のみとしてしまえば、その分大きな値まで扱うことができるわけです。
また、int型の変数はサイズを明示する修飾子を指定することもできます。比較的小さな値しか扱わないのならばshort int(または単にshort)、大きな値を扱う場合はlong int(または単にlong)のように使い分けることができます。ただし、現行機種のMacのプラットフォームでは、int型とlong型は同じサイズになっています(intとlongは32ビット、shortは16ビット)。
各データ型の具体的なサイズ(特にint型のサイズ)は、プラットフォームによって異なります。これを確認するには、「printf("int size : %d", sizeof(int));」のようにsizeof関数を利用します(結果はバイト数で返されます)。各サイズで表現できる値の範囲は、整数の場合には以下のようになります。
- 2バイト(16ビット)
符号あり -32768〜32767
符号なし 0〜65535 - 4バイト(32ビット)
符号あり -2147483648〜2147483647
符号なし 0〜4294967295
小数を表すデータ型
小数を扱うときは、double型またはfloat型の変数を利用します。double型の方がサイズが大きく、精度が高くなります。現行機種のMacのプラットフォームでは、double型が64ビット、float型は32ビットとなっています。
普通に小数点を含めて数値を記述すると、double型として扱われます。float型として扱いたい場合は、数値の後ろに「f」を付加します。double型、float型の変数の初期化は、以下のようになります。
double myDouble = 1.2345; float myFloat = 1.23f;
文字を表すデータ型
アルファベットなど1バイトの文字を1文字ずつ扱う場合には、char型の変数を利用できます。値は、シングルクォーテーションで囲んで記述します。
char myChar = 'a';
ただし、後述のNSStringなどのクラスを利用すれば、シングルバイト文字だけでなく日本語などのマルチバイト文字も扱うことができますので、多くの場合、それらの文字列クラスを利用することになるでしょう。
真偽値を表すデータ型
C言語では、if文などで利用される真偽値(true/false)としては、0がfalse、それ以外はtrueというように判断されます。これはObjective-Cでも同じですが、Objective-Cでは特に真偽値(1か0か)を表すためのデータ型として、BOOL型が用意されています。また、true(1)を表すキーワードとしてYES、false(0)を表すキーワードとしてNOが定義されています。
BOOL isAuthenticated = YES; BOOL isPermitted = NO;
クラスオブジェクトを表すデータ型
クラスのオブジェクト(インスタンス)を表す変数の宣言方法は、2種類あります。1つは、クラス名をそのまま型名として宣言する方法です。例えば以下のようになります。
MyClass *myClass;
クラスオブジェクトの変数は常にポインタとして宣言する必要があるため、変数名の前には*(アスタリスク)を付加します。ポインタは、その変数が表すデータが割り当てられているメモリ上のアドレスを保持する変数です。ポインタ型の変数を通じて、プログラムのさまざまな場面で同一のインスタンスにアクセスすることができるわけです。
もう1つの宣言方法は、id型を利用する方法です。例えば以下のようになります。
id myClass;
id型は、すべてのクラスオブジェクトで利用できる汎用的な型で、これもやはりアドレス情報を保持するポインタです。ただし、id型の場合には*(アスタリスク)を付加する必要はありません。
オブジェクトの変数が、空っぽで何も指し示していない(アドレス情報を保持していない)状態は、nilという値で表現されます。
id myClass = nil;
nilは、実際には0という値です。従って、先ほど説明した真偽値の判定ではfalseとして扱うことができます。ただし、nilは明示的にセットする必要があります。単に宣言だけを行って値を代入していないオブジェクトは、値が保証されません。
なお、クラスのインスタンス変数は、メモリ上にインスタンスが割り当てられるときにnilで初期化されます。
Copyright © ITmedia, Inc. All Rights Reserved.