Objective-CとSwiftを使ってみよう – 計算を行うでは計算の仕方を説明した。今回はクラスの定義の仕方の説明を行いたい。Objective-CとSwiftでは大きく異なるため、今回はObjective-Cについて説明を行いたい。
クラスの定義の仕方
Objective-Cではクラスを定義する際は、宣言部分と実装部分を別々に分ける。例えば、Helloという名称のクラスを作成したい場合は、Hello.hとHello.mファイルを作成し、それぞれに宣言部分と実装部分を定義する。
宣言部分は@interface 〜 @endで囲い、実装部分は@implementation 〜 @endで囲う。
以下にサンプルコードを書きたい。
サンプルコード
Hello.h
#import <Foundation/Foundation.h>
@interface Hello : NSObject
- (void)sayHello;
@end
Hello.m
#import "Hello.h"
@implementation Hello
- (void)sayHello {
printf("Hello, world\n");
}
@end
フィールド変数を定義する
フィールド変数は、@interfaceまたは@implementationの直後に{ }を囲い、その中に定義する。通常は他のクラスからアクセスすることは避けるべきであるため、@implementationの直後に定義するのが望ましいだろう。
@implementation Hello {
@private
int foo;
int bar;
}
プロパティーを定義する
プロパティーを定義するときは、宣言部分に以下のコードを書く。ここではプロパティー名をbazとした場合である。
@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メソッドが生成されないため、手動で行う必要がある。
メソッドを定義する
メソッドは以下のように定義する。
/// 宣言部分に書く
- (void)sayHello;
// 実装部分に書く
- (void)sayHello {
print("Hello,world\n");
}
引数を指定したい場合は、以下のようになる。
// 引数が一つの場合
- (void)doSomethingWithFoo: (int)foo;
// 引数が二つの場合
- (void)doSomethingWithFoo: (int)foo bar: (int)bar;
なお、Objective-Cではメソッドについては、インスタンスメソッドとクラスメソッドの2種類があり、インスタンスメソッドはそのインスタンスに対して、クラスメソッドはクラスに対して行われる。
// インスタンスメソッド
- (void)sayFoo;
// クラスメソッド
+ (void)sayBar;
Objective-Cにおけるプロパティーとメソッドの注意点
Objective-Cでは、すべてのメソッド/プロパティーがpublic扱いになるため、他のオブジェクトからアクセスされたくないときは、ヘッダーファイルには定義しないというような対策をが必要になる。
また、クラスプロパティーもないため、ファイル単位のグローバル変数とクラスメソッドを使って代用する必要がある。については、macOS 10.12/iOS 10 SDKでObjective-Cでも使えるようになったが、実装は手動で行う必要があるため、かなり面倒なところがある。
最後に
今回はObjective-Cのクラスの定義、及びそれに付随する変数、プロパティー、メソッドの定義について説明を行った。Objective-Cではかなり独特な書き方をすること、一部機能が欠けているということもあり、代替手段を使わなければならないところはあるが、やりたいことは十分やれる。
次はSwiftでのクラスの定義の仕方について説明したい。
