プロトコル - shirai/SwiftLearning GitHub Wiki

プロトコル

概論

目標

  • プロトコルの概念について説明できる

わかったこと

  • そもそもプロトコルとは「複数の者が対象となる事項を確実に実行するための手順等について定めたもの」という意味
  • Objective-Cにおけるプロトコルは「複数のクラスで共通して使用できるメソッドの集まり」という意味

わからなかったこと

  • delegateとプロトコルの違い

つぎにやること

■詳解Objective-C2.0第12章(p304~)読み込み

宣言

目標

  • 任意のプロトコルが宣言できる

わかったこと

  • プロトコルの宣言 @protocol プロトコル名 -(void)hoge @end

つぎにやること

■詳解Objective-C2.0第12章(p304~)読み込み

採用

目標

  • 作成した任意のプロトコルを採用したクラスを作成できる

わかったこと

  • プロトコルの採用 @interface クラス名 : スーパークラス名 <プロトコル名>

つぎにやること

■詳解Objective-C2.0第12章(p304~)読み込み

継承

目標

  • プロトコルを継承したプロトコルを作成できる

わかったこと

  • プロトコルを継承したプロトコルは、継承元のプロトコルのメッソド群にメソッドを追加できる @protocol プロトコル名<継承したいプロトコル名1,継承したいプロトコル名2> -(void)hoge @end

つぎにやること

■詳解Objective-C2.0第12章(p304~)読み込み

型宣言

目標

  • プロトコルを指定した型宣言ができる

わかったこと

@property (weak,nonatomic)id delegate;

わからなかったこと

  • プロトコルを指定した型の具体的な利用方法

つぎにやること

■詳解Objective-C2.0第12章(p304~)読み込み

delegate

目標

  • プロトコルを利用し、自作のdelegateを作成できる

わかったこと

  • .h ファイルのプロトコル句( @protocol ~ @end )内にデリゲートメソッドを定義する
  • デリゲートメソッドには必ず実装すべき@requiredと、実装が任意の@optionalがある ** @requiredはTableViewでいうところのtableView:numberOfRowsInSectionとtableView:cellForRowAtIndexPathのように 実装しなければならないdelegateメソッドを定義する場合に使う ** @optionalはtableViewの他のdelegateメソッドのように、実装が任意の、いわば拡張機能のような部分に使う *** 自身でdelegateメソッドを用意する場合は、基本必要なメソッドしか作らないので、@requiredを使う

実装手順

  1. 通知元(ここではEditViewController)の.hファイルにプロトコル、デリゲートメソッド、デリゲートインスタンスを宣言する /*! @protocol editViewDelegate @abstract ViewControllerに処理を委譲するdelegateの定義 */ @protocol editViewDelegate  //このが型宣言

     @required
     - (void)editViewController:(EditViewController *) editViewController willDismissWithEntity:(AddressEntity *)entity;
    
     @end
    
     @interface EditViewController : UIViewController
    
     /*! @abstract ViewControllerに処理を委譲するdelegateのインスタンスを定義 */
     @property (weak,nonatomic)id<editViewDelegate> delegate;
    
     @end
    
  2. 通知元(ここではEditViewController)の.mファイルにデリゲートメソッドの呼び出しを実装

     - (IBAction)pushedCompleteBtn:(id)sender {
      //以下3行がデリゲートメソッドの呼び出し
      // デリゲートインスタンスが editViewController:willDismissWithEntity: メソッドを実装しているか確認します。
       if ([self.delegate respondsToSelector:@selector(editViewController:willDismissWithEntity:)]){
         [self.delegate editViewController:self willDismissWithEntity:self.entity];
       }
       //元の画面に戻るメソッド
       [self dismissViewControllerAnimated:YES completion:nil];
     }
    
  3. 準拠するプロトコルを通知先(ここではViewController)の.mファイルに採用 @interface ViewController ()

  4. 通知先(ここではViewController)の.mファイルに採用したデリゲートメソッドの処理を実装 (void)editViewController:(EditViewController *) editViewController willDismissWithEntity:(AddressEntity *)entity;{ //行いたい処理 self.entity = entity; }

わからなかったこと

次にやること

■項目学習課題2作成 ■学習まとめ作成 ■項目学習課題4復習作成

オプション

目標

  • プロトコルの必須/オプションを設定できる

わかったこと

  • プロトコルを宣言した際に、メソッドの上に@requiredをつければ実装必須
  • @optionalをつけると実装任意のメソッドが作成できる
  • 指定しなかった場合は@requiredと判断され、実装しないとコンパイルエラーとなる

つぎにやること

■詳解Objective-C2.0第12章(p304~)読み込み

参考

iOSアプリ開発におけるNotification(通知)の使い方 NSNotificationCenter-iPhoneアプリ開発の虎の巻 DelegateとNotificationの使い分け textFieldが隠れない!NSNotificationCenterの使い方その1

⚠️ **GitHub.com Fallback** ⚠️