Objective-C構文の拡張(Extension)の使用

4112 ワード

Objective-C 2.0はClass Extensionを追加して2つの問題を解決します.
  • は、プライベート読み書き可能な属性を宣言することができ、クラスの宣言では同名の公開読み取り専用属性であり、公開読み取り専用、プライベート読み取り可能書き込み可能な属性
  • をサポートする.
  • は、プライベートメソッドを宣言することができる.オブジェクトがプライベート@interfaceを持つことができ、コンパイラによって
  • を検証できます.

    公開読取り専用、プライベート書き込み可能属性(Publicly-Readable,Privately-Writeable Properties)


    可変(immutable)のデータ構造を実現するには、通常、外部コードがsetterメソッドでオブジェクトの状態を変更できないという利点がある.しかし、内部で書き込み可能な属性であることが望ましいかもしれません.Extensionでは、次のことができます.
    クラスの拡張では、属性がプライベート読み取り可能または書き込み可能であることを宣言し、クラスの宣言で定義された同名の属性は公開読み取り専用です.これにより、外部コードの場合、この属性は読み取り専用になりますが、内部コードはsetterメソッドを使用できます.

    プライベートメソッド(Private Method)


    Objective-C 2.0以前は、プライベートメソッドを定義するには、実装ファイルで「Private」Categoryを宣言するのが一般的でした.
    BaseClass+Private.h
    1 @interface BaseClass (Private) //   
    2 - (void)privateMethod;
    3   
    4 @end

    しかしながら、クラスのプライベートメソッドは、通常、上記のCategoryの方法のように独立した@interfaceブロックに存在するのではなく、クラスの@implementationブロックに存在することが望ましい.実際、CategoryはObjective-Cのpublic/private限定の不足を補うだけだ.
    本当の問題はObjective-CコンパイラがCategoryで宣言した方法が他の場所で実現されると考えているので、コンパイラはそれらが本当に実現されたかどうかを確認しようとしません.つまり,開発者が宣言する方法は実現していない可能性があり,コンパイラにも警告はない.コンパイルは、他の場所や独立したファイルで実現されると考えられます.
    Exteionsionを使用すると、宣言された属性とメソッドのインプリメンテーションがClassの@implementationブロックに配置されます.そうでないと、コンパイラがエラーを報告します.
    ExtensionClass.h
    1 @interface ExtensionClass : NSObject //   
    2 @property (retain, readonly) float value; // 
    3   
    4 @end

    ExtensionClass.m
     1 @interface ExtensionClass() // (Extension)
     2 @property (retain, readwrite) float value; //1、 ; 
     3    
     4 - (void)privateMethod; //2、   
     5 @end   
     6    
     7 @implementation ExtensionClass // 
     8    
     9 //
    10 - (void)privateMethod {   
    11     // implement private method here;   
    12 }   
    13    
    14 @end

    ExtensionとCategoryは似ているように見えますが、実は違います


    ExtensionはCategoryと文法が似ているため、匿名のCategoryと誤解されることが多いが、目的と行為は異なる.