Objective-C言語のメモ書き(4)

2010. 03. 13
●プロトコル

まだ理解できていないのですが避けてばかりもいられないので、現時点で分かる範囲だけでもメモしていきます。

iPhone SDKプログラミング大全』では『ある特定の機能を提供するメソッドの集合を宣言する』とありますが、これだけではよく分かりません。

本書でもそうですが、プロトコルについて調べてみると『Javaでいうinterface』と判を押したように書かれています。

プロトコルに限った話ではありませんが、Objective-Cの用語を調べると、往々にして同じオブジェクト指向言語のC++やJavaなどが引き合いに出されますよね。

私のようにiPhoneでプログラミングを始めようと志した人にとっては、『Objective-Cを学ぶのにC++やJavaを覚えなきゃならないの?』と眉を顰めてしまうわけで、結構困ったものです。

プログラミング経験無しでiPhoneプログラミングに飛び込んでくる人って、他のプラットフォームより多いと思うんですけどね・・・感覚的にですけど。

・プロトコルの概念

閑話休題。

とっかかりとして分かり易く説明されていたのが、聖典と名高い『詳解 Objective-C 2.0』でした。

実世界での例として、

・CDプレイヤ、MDプレイヤ、MP3プレイヤには再生、停止、スキップなど共通した操作がある
・共通した操作に対し、どう実装されているかは個々のプレイヤによって異なる

と上げられていまして、

・プレイヤ = オブジェクト
・再生、停止などの操作 = メソッド

とすると、共通した操作郡がプロトコルというもので、『機能の実装内容はさておき、操作にあたるメソッドは定義しておきます』というものです。

操作するメソッドに対応さえしていれば、各オブジェクトの継承関係や実現しているクラスに関係無く扱うことができます。

例えば標準アプリケーションのiPodで、音楽再生とPodcastの再生画面を見てみます。

200

201

この場合、画面下部の巻き戻し、再生/一時停止、早送りのボタンと音量調整のスライダはデザインだけではなく、機能としても共通です。

しかし再生しているファイルはMPEG-4オーディオファイルとMPEG-4ビデオファイルで、機能を実現しているクラスは異なります。

実際にiPodがこの部分にプロトコルを使用しているかどうかは定かではありませんが、概念としてこういうものではないかと思います(多分)。

再生/一時停止ボタンや音量調整スライダなどのメソッドがプロトコルで定義されているとした場合、オーディオプレイヤとビデオプレイヤのクラスが定義されている全てのメソッドに対応していれば、プロトコルに適合(conform)あるいは準拠していると言います。

・プロトコルの宣言

プロトコルの宣言は『@protocol』で始まり『@end』で終わります。

@protocol プロトコル名
    メソッド1の宣言;
@optional
    メソッド2の宣言;
@required
    メソッド3の宣言;
@end

プロトコル名もクラス同様、大文字で始まるのが慣例です。

宣言するメソッドの内、@required以降に書かれたメソッド(メソッド3)は実装が必須になり、@optional以降のメソッド(メソッド2)は実装の有無を問いません。

@requiredや@optionalの指定が無い場合(メソッド1)は@required扱いとなります。
(『iPhone SDKプログラミング大全』76~77ページで『指定の無い場合は、@optionalと同じ扱いになる』は間違いです)

・プロトコルへの準拠

プロトコルに準拠したメソッドを実装したクラスの宣言は『@interface』で始まり『@end』で終わるのは共通ですが、スーパークラス名の後にプロトコル名を追加します。

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

プロトコルを指定してクラスを宣言した場合、クラスはプロトコルを採用(adopt)していると言います。

一つのクラス宣言で複数のプロトコルを採用する場合は、<>内にカンマ区切りでプロトコルを列挙します。

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

と、ここまで書いてみたものの、実際にどう使うのかというのがいまいち見えてきません。

iPhone SDKの教科書』のバランスとパイルでプロトコルを使っていましたが、どちらも使っていたのはデリゲートで、そのデリゲートをまだ理解してないのが致命的なのですが・・・

iPhone SDKプログラミング大全』では3ページしかプロトコルについて割かれていないので、ひとまずこの辺で止めておきます。



参考文献

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)
(2009/09/08)
木下 誠

商品詳細を見る

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る






Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
Sun Mon Tue Wed Thu Fri Sat
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Bose QuietComfort 20
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR