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

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

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でのクラスの定義の仕方について説明したい。

タイトルとURLをコピーしました