2012年1月27日金曜日

プロトコルを理解する1 objective-c

  • 公開日:2012年01月17日
  • 最終更新日:2015年5月17日

環境

  • Xcode6.1

プロトコルとは

objective-Cにはプロトコルという概念があります。
プロトコルは、オブジェクトの役割や振る舞いをあらわすメソッドの集合のことです。
ちなみに、java言語におけるインターフェースという概念は、objective-Cのプロトコルを取り入れています。

プロトコルの宣言

プロトコルは、メソッド宣言の集合であり、実現方法は各クラスに任されます。
以下のように宣言します。

    @protocol プロトコル名
    メソッド宣言;
    @end

xcode6.xでプロトコルファイルを作成する場合は、
追加→iOS→Source→新規ファイル→Objective-C File→ファイル名入力,Fileの種類でProtocolを選択
といった手順になります。

上記の構文を使ってサンプルのプロトコルを実装してみます。

// ファイル名:Lesson.h
@protocol Lesson
- (void)attend;
- (void)absent;
@end

プロトコルファイルは通常ヘッダファイル(xxxxx.h)として記述します。
また、プロトコルを利用する場合は、必要とするクラス宣言でインポートします。
プロトコルの利用はインターフェースで以下のように宣言します。

    @interface クラス名 : スーパークラス名 <プロトコル名> {
      インスタンス変数;
    }
    メソッドの宣言:
    @end

プロトコルの宣言をした場合、インターフェースで宣言したメソッドと同様に、実装部で実装する必要があります。

上記の構文を使って実装してみます。プロトコルは、先ほど作成したLessonプロトコルを使用します。

#import "Lesson.h"

@interface ViewController : UIViewController <Lesson>{
    
}

@end

上記のように宣言すると、プロトコルに含まれているメソッドはクラスの宣言の一部として記述されたのと同じことになります。そのため、クラスのインターフェース(xxxx.h)でメソッドを改めて記述する必要はありません。

複数プロトコルの宣言

又、プロトコルは複数指定することも可能です。インターフェースの<>内で【,】で区切って複数のプロトコル名を記述します。

    @interface クラス名 : スーパークラス名 <プロトコル名1, プロトコル名2> {
      インスタンス変数;
    }
    メソッドの宣言:
    @end

複数のプロトコルに同じメソッド宣言が重複して含まれていても問題ありません。
また、カテゴリに対してもプロトコルを採用することを宣言できます。

プロトコルの継承

プロトコルは継承も可能です。

プロトコルの意義は、プロトコルを採用したクラスがどういう機能に対応しているかを明確にすることです。クラスがどのプロトコルを採用しているかを知るには、Class ReferenceのConforms toグループで確認できます。
例えば、NSStringクラスならば、

  • NSCoding
  • NSCopying
  • NSMutableCopying
  • NSObject (NSObject)
のプロトコルに対応していることになります。

長くなったので、その2へ続きます。

objective-cの名著の紹介

Objective-cをしっかりと理解したいしたいなら、詳細objective-cがオススメです。
読むたびに理解が深まる良書です。なるべく手元置いておきたい一冊です。

参考

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...