Objective-CとSwiftを使ってみよう – クラスを定義する(Objective-C編)

Objective-CとSwiftを使ってみよう – 計算を行うでは計算の仕方を説明した。今回はクラスの定義の仕方の説明を行いたい。Objective-CとSwiftでは大きく異なるため、今回はObjective-Cについて説明を行いたい。

クラスの定義の仕方

Objective-Cではクラスを定義する際は、宣言部分と実装部分を別々に分ける。例えば、Helloという名称のクラスを作成したい場合は、Hello.hとHello.mファイルを作成し、それぞれに宣言部分と実装部分を定義する。

宣言部分は@interface@endで囲い、実装部分は@implementation 〜 @endで囲う。

以下にサンプルコードを書きたい。

サンプルコード

Hello.h

Hello.m

フィールド変数を定義する

フィールド変数は、@interfaceまたは@implementationの直後に{ }を囲い、その中に定義する。通常は他のクラスからアクセスすることは避けるべきであるため、@implementationの直後に定義するのが望ましいだろう。

プロパティーを定義する

プロパティーを定義するときは、宣言部分に以下のコードを書く。ここではプロパティー名を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メソッドが生成されないため、手動で行う必要がある。

メソッドを定義する

メソッドは以下のように定義する。

引数を指定したい場合は、以下のようになる。

なお、Objective-Cではメソッドについては、インスタンスメソッドとクラスメソッドの2種類があり、インスタンスメソッドはそのインスタンスに対して、クラスメソッドはクラスに対して行われる。

Objective-Cにおけるプロパティーとメソッドの注意点

Objective-Cでは、すべてのメソッド/プロパティーがpublic扱いになるため、他のオブジェクトからアクセスされたくないときは、ヘッダーファイルには定義しないというような対策をが必要になる。

また、クラスプロパティーもないため、ファイル単位のグローバル変数とクラスメソッドを使って代用する必要がある。については、macOS 10.12/iOS 10 SDKでObjective-Cでも使えるようになったが、実装は手動で行う必要があるため、かなり面倒なところがある。

最後に

今回はObjective-Cのクラスの定義、及びそれに付随する変数、プロパティー、メソッドの定義について説明を行った。Objective-Cではかなり独特な書き方をすること、一部機能が欠けているということもあり、代替手段を使わなければならないところはあるが、やりたいことは十分やれる。

次はSwiftでのクラスの定義の仕方について説明したい。

ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。ご用の方はコメントかコンタクトフォームにて。