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でのクラスの定義の仕方について説明したい。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。