Objective-C は、次の@encode
ように、プリミティブやクラスを含む任意の型を表す C 文字列を生成します。
NSLog(@"%s", @encode(int)); // i
NSLog(@"%s", @encode(float)); // f
NSLog(@"%s", @encode(CGRect)); // {CGRect={CGPoint=ff}{CGSize=ff}}
NSLog(@"%s", @encode(NSString)); // {NSString=#}
NSLog(@"%s", @encode(UIView)); // {UIView=#@@@@fi@@I{?=b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b6b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b3b1b1b1b2b2b1}}
したがって、クラス (クラス名を含むもの) の意味のあるエンコーディングを を使用して取得できますが@encode(ClassName)
、ジェネリックのエンコーディングと同じ形式でもありますstruct
(上記の例のように)。
さて、私の質問は、(もちろん有効な)型エンコーディングが与えられた場合、エンコーディングがObjective-Cクラスのものであるかどうかを調べることは可能ですか?そうであれば、Class
そのエンコーディングに対応するオブジェクトを取得することは可能ですか?
もちろん、型エンコーディングからクラス名を解析して、 を使用してクラスを取得することもできNSClassFromString
ますが、それは適切な方法ではないように思えますし、特にパフォーマンス効率もよくありません。これは本当にこれを達成するための最良の方法ですか?