Posted at

Objective-Cのプロトコルというもの

More than 5 years have passed since last update.


前提

基本的に勉強中です。

Objective-CのプロトコルはJavaのインターフェース相当とか結構いろいろなところに書いてあるので、こんな感じかなとあんまり実用性のない例で書いてみました。


プロトコルTalk


Talk.h

#import <Foundation/Foundation.h>

@protocol Talk <NSObject>
@required
-(void)talk;
@end


クラスCat


Cat.h

#import <UIKit/UIKit.h>

#import "Talk.h"
@interface Cat : NSObject <Talk>
@end


Cat.m

#import "Cat.h"

@implementation Cat
-(void)talk{
NSLog(@"ニューー");
}
@end


クラスDog


Dog.h

#import <Foundation/Foundation.h>

#import "Talk.h"
@interface Dog : NSObject <Talk>
@end


Dog.m

#import "Dog.h"

@implementation Dog
-(void)talk{
NSLog(@"わうん");
}
@end


MainとしてクラスViewController.mで実行


ViewController.m

#import "ViewController.h"

#import "Cat.h"
#import "Dog.h"
@interface ViewController ()
{
NSMutableArray <Talk> *objects;
}
@end

@implementation ViewController

- (void)viewDidLoad {
objects = [@[] mutableCopy];
Cat *cat = [[Cat alloc] init];
Dog *dog = [[Dog alloc] init];

[objects addObject:cat];
[objects addObject:dog];

for (int i = 0; i<[objects count]; i++) {
[objects[i] talk];
}
}
@end


2014-05-20 22:23:34.009 abdcfgl[67806:60b] ニューー

2014-05-20 22:23:34.009 abdcfgl[67806:60b] わうん


<Talk>とか書いてあるけれど、Talkプロトコルと関係ないオブジェクトも配列に追加できて、talkメソッド無いと実行時エラーになった。そもそもジェネリックスではないだろう!と。

全然まだまだだけど。なんとなく、少しわかった。