関数によって返されたプロパティ属性から解析できproperty_getAttributes()
ます。プロパティのタイプは、最初の文字 ( 'T' と定義されている) と最初のコンマの間のテキストを調べることで判断できます。オブジェクト タイプの場合、このテキストは @"ClassName" の形式になります。id
型プロパティには @ 記号のみが含まれ、引用符、クラス名、またはプロトコル名は含まれません。NSScanner
あなたの好みが何であれ、ここでかなり効果的に、または正規表現を使用することができます。
プログラム例とその出力:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@protocol MyProtocol <NSObject>
- (void)someMethod;
@end
@interface MyObject : NSObject
@property (strong) id<MyProtocol> implementor;
@end
@implementation MyObject
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
objc_property_t property = class_getProperty([MyObject class], "implementor");
const char *propertyAttributes = property_getAttributes(property);
NSLog(@"property attributes = %s", propertyAttributes);
}
return 0;
}
プログラムの出力は
2013-03-28 16:39:17.401 PropertyReflection[56502:303] property attributes = T@"<MyProtocol>",&,V_implementor
ここで、Kevin Ballard が指摘するように、この動作は、T の後の@encode
文字列がプロパティの型の文字列であると述べているドキュメントと矛盾していることに注意するのが賢明です。私がこれを書いたとき、私はそれが事実だと思っていました。ただし、確認したところ、の結果@encode(id<MyProtocol>)
は実際には単に「@」であるため、自己責任で使用してください。確かに、その文字列を解析するコードは、正常に失敗する準備ができている必要があり、ミッション クリティカルなデータ抽出に依存してはなりません。この情報がどうしても必要というよりは利便性として望まれるのであれば、これは先に進むのに適していると思います。