プロパティにカスタム属性を追加するのは一般的ではありませんが望ましいと思います。この機能は、クラスのプロパティに関するカスタムトラバーサルに使用できます。私はSQLを扱うときにこの機能が必要でした。例えば、EXCLUDE_FROM_SELECT
、INCLUDE_BY_INSERT
、EXCLUDE_FROM_UPDATE
のような属性を持っていれば、それは非常に良いでしょう。
実際、@propertyディレクティブで有効にする方法があるかどうかはわかりません。しかし、私たちは同様のことをする可能性があります:
objc/runtime.hを見れば、公式サイトには記載されていない関数:class_replaceProperty
が見つかりました。 class_addProperty
という類似の関数が文書化されており、前の引数の説明を理解するのに役立ちます。実際には、@propertyはこの関数を使ってプロパティ設定を行うと考えています(しかし、私はそれを証明できません)。
あなたはまた、次のような機能が必要になる場合があります
void class_copyPropertyList(...);
void property_copyAttributeList(...);
void class_getProperty(...);
、これらの機能を使用することによって、あなたが実際に何をするか@property何かを行うことができます。
void prepareClass(...);
void registerAttributes(...);
void endRegister(...);
をそして、我々はあなたのtagartクラスの+initialize
機能のレジスタ操作を行うことができます:私は、以前のSQLの問題のためにした何
は、カスタム属性を登録するには3つの機能を定義することです。
しかし、宣言から直接プロパティ設定を見たい場合があるので、コード(単純な@interface + @property宣言と比較して)を使用することは最良の解決策ではないかもしれません。
:あなたはこの打ちを処理するために、あなたのマクロを定義することができ、したがって、
@interface MyVO : NSObject
__attribute__((constructor))
void prepareForMyVO(){ prepareClass(MyVO);}
@property (strong) id p1;
__attribute__((constructor))
static void registerAttrForP1(){ registerAttributes("p1", EXCLUDE_FROM_SELECT);}
@property (strong) id p2;
__attribute__((constructor))
static void registerAttrForP2(){ registerAttributes("p2", INCLUDE_BY_INSERT);}
@end
__attribute__((constructor))
static void endRegisterForMyOV(){ endRegister();};
:あなたはこれをやって
が
は@interfaceの@endが実際に許可する:そして、実際に我々は__attribute__((constructor))
とマクロを使用することによって、より良い、それを行うことができます
#define $p(clazz, zuper) class : zuper \
__attribute__((constructor)) static void prepareFor ## clazz(){ prepareClass(#MyVO);}
#define $r(p, attr) p; \
__attribute__((constructor)) static void registerAttrFor ## p(){ registerAttributes(#p, attr);}
#define $e(clazz) __attribute__((constructor)) static void endRegister ## clazz(){ endRegister();};
@interface $p(MyVO, NSObject)
@property (strong) id $r(p1, EXCLUDE_FROM_SELECT);
@property (strong) id $r(p1, INCLUDE_BY_INSERT);
@end $e(MyVO)
PS:上記のコーディングは正確なコーディングではなく、単なる例です。最後のマクロソリューションが動作するかどうかはわかりません。 これが役立つことを願っています。
http://stackoverflow.com/questions/4919021/custom-property-attributes-in-objective-c – rishi
@rishi、ありがとうございます。私の具体的な状況は、この質問に対する答えには本当に満足していません。他の戻り値の型を作成することはできません。私はそれが可能かどうかの答えを探しています - もしそうなら、どうしたらいいですか。 – driis
残念ながら、コンパイラを変更することはありません。 –