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

Qiitaから転載します。

前提

基本的に勉強中です。

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

プロトコルTalk

#import <Foundation/Foundation.h>
@protocol Talk <NSObject>
@required
-(void)talk;
@end

クラスCat

#import <UIKit/UIKit.h>
#import "Talk.h"
@interface Cat : NSObject <Talk>
@end
#import "Cat.h"
@implementation Cat
-(void)talk{
    NSLog(@"ニューー");
}
@end

クラスDog

#import <Foundation/Foundation.h>
#import "Talk.h"
@interface Dog : NSObject <Talk>
@end
#import "Dog.h"
@implementation Dog
-(void)talk{
    NSLog(@"わうん");
}
@end

Mainとしてクラス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メソッド無いと実行時エラーになった。そもそもジェネリックスではないだろう!と。

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