Objective-CとSwiftを使ってみよう – 計算を行うでは計算の仕方を説明した。今回はクラスの定義の仕方の説明を行いたい。Objective-CとSwiftでは大きく異なるため、今回はObjective-Cについて説明を行いたい。
クラスの定義の仕方
Objective-Cではクラスを定義する際は、宣言部分と実装部分を別々に分ける。例えば、Helloという名称のクラスを作成したい場合は、Hello.hとHello.mファイルを作成し、それぞれに宣言部分と実装部分を定義する。
宣言部分は@interface
〜 @end
で囲い、実装部分は@implementation
〜 @end
で囲う。
以下にサンプルコードを書きたい。
サンプルコード
Hello.h
1 2 3 4 5 6 7 8 |
#import <Foundation/Foundation.h> @interface Hello : NSObject - (void)sayHello; @end |
Hello.m
1 2 3 4 5 6 7 8 9 10 |
#import "Hello.h" @implementation Hello - (void)sayHello { printf("Hello, world\n"); } @end |
フィールド変数を定義する
フィールド変数は、@interface
または@implementation
の直後に{ }
を囲い、その中に定義する。通常は他のクラスからアクセスすることは避けるべきであるため、@implementation
の直後に定義するのが望ましいだろう。
1 2 3 4 5 6 |
@implementation Hello { @private int foo; int bar; } |
プロパティーを定義する
プロパティーを定義するときは、宣言部分に以下のコードを書く。ここではプロパティー名をbaz
とした場合である。
1 2 |
@property int baz; |
この場合は、baz
プロパティーの実際の数値を格納する変数(_baz)、及びその値を取得(-[Hello baz]
)/設定(- [Hello setBaz:]
)するメソッドが自動的に生成される。これらはコードで処理を変更することができる。
また、プロパティーには属性を加えることが可能で、属性をつけられた場合はそれにしたがって変更される。この場合は@property (nonatomic) int baz;
のように、@property
と変数の型の間に入れる。
プロパティーの属性の例
atomic
– スレッドセーフなプロパティーnonatomic
– 非スレッドセーフなプロパティーassign
– プリミティブ型のデフォルトの属性だが、通常は省略する。strong
– 強い参照(参照型のデフォルトの属性)weak
– 弱い参照unsafe_unretained
– 保持しない参照readonly
– 読み取り専用(setterメソッドを生成しない)readwrite
– 読み書き可能getter=***
– getterメソッドの名称を指定する(BOOL型のgetterメソッドは多くの場合、isEnabled
などのようにis
をプレフィックスに付与することが多い)。setter=***
– setterメソッドの名称を指定する。class
– クラスプロパティー。Swiftから呼び出すときにプロパティーのように振る舞う。Singletonオブジェクトなどに使う。この属性が指定された場合は、自動的にgetter/setterメソッドが生成されないため、手動で行う必要がある。
メソッドを定義する
メソッドは以下のように定義する。
1 2 3 4 5 6 7 8 |
/// 宣言部分に書く - (void)sayHello; // 実装部分に書く - (void)sayHello { print("Hello,world\n"); } |
引数を指定したい場合は、以下のようになる。
1 2 3 4 5 6 |
// 引数が一つの場合 - (void)doSomethingWithFoo: (int)foo; // 引数が二つの場合 - (void)doSomethingWithFoo: (int)foo bar: (int)bar; |
なお、Objective-Cではメソッドについては、インスタンスメソッドとクラスメソッドの2種類があり、インスタンスメソッドはそのインスタンスに対して、クラスメソッドはクラスに対して行われる。
1 2 3 4 5 6 |
// インスタンスメソッド - (void)sayFoo; // クラスメソッド + (void)sayBar; |
Objective-Cにおけるプロパティーとメソッドの注意点
Objective-Cでは、すべてのメソッド/プロパティーがpublic扱いになるため、他のオブジェクトからアクセスされたくないときは、ヘッダーファイルには定義しないというような対策をが必要になる。
また、クラスプロパティーもないため、ファイル単位のグローバル変数とクラスメソッドを使って代用する必要がある。については、macOS 10.12/iOS 10 SDKでObjective-Cでも使えるようになったが、実装は手動で行う必要があるため、かなり面倒なところがある。
最後に
今回はObjective-Cのクラスの定義、及びそれに付随する変数、プロパティー、メソッドの定義について説明を行った。Objective-Cではかなり独特な書き方をすること、一部機能が欠けているということもあり、代替手段を使わなければならないところはあるが、やりたいことは十分やれる。
次はSwiftでのクラスの定義の仕方について説明したい。
