Objective-Cでは、いくつかのタイプに制限id
することは可能ですか?パラメータを持つメソッドを書きたいのですid
が、このメソッドは一部のObjCタイプにのみ適用されます。使用id
するとランタイムエラーが発生する可能性があります。LLVMの慣習などはありますか?
3 に答える
オブジェクトを扱っている限り、そのクラスを要求できます。
id anId;
if ([anId isKindOfClass:[NSNumber class]]) {
...
}
id
は一般的なObjective-Cオブジェクトポインタです。つまり、任意のオブジェクトを意味します。
タイプを制限できる唯一の方法は、プロトコルを使用することです。
id <myProtocol>
したがって、このようにして、myProtocol
プロトコルを採用する任意のオブジェクトをポイントします。
「制限」id
はObjective-Cが持っているものではありません。とにかく、型がメソッド宣言で指定された型と一致しないオブジェクトを渡すと、警告のみが表示され、コンパイラエラーは表示されないため(を使用してコンパイルしない限り-Werror
)、コンパイラは実際にあなたを防ぐことはできません。これを行うことから。
はい、これはランタイムエラーが発生しやすいですが、Objective-Cはこのように機能します。あなたがしなければならないことの1つは、どのタイプが受け入れられるかを文書化することです。
できることの1つは、またはのメソッドを使用して、実行時にタイプをチェックすることです。また、オブジェクトが応答する必要のあるメッセージの共通セットがある場合は、それらをプロトコルにラップして、タイプの式を要求できます。isKindOfClass:
isMemeberOfClass:
NSObject
id <MyProtocol>