4

Classオブジェクトを特定のプロトコルにキャストしようとしています。このプロトコルは、そのクラスが実装するクラスメソッド(+)を定義します。

この質問で概説されているように、(id <protocol>)を使用してこれを行う方法は知っていますが、Classオブジェクトの正しい方法を理解できないようです。

基本的なシナリオは次のとおりです。

私はプロトコルを持っています:

@protocol Protocol <NSObject>
+ (id)classMethod:(id)arg;
@end

次に、Classオブジェクトを受け入れる関数があります。これは、別の引数に基づいてプロトコルに準拠することがあることを知っています(これは明らかに非常に単純化されています)。

- (id)someMethodWithClass:(Class)cls andUseArg:(BOOL)arg
{
    id instance;
    if (arg != nil) {
        instance = [(Class<Protocol>)cls classMethod:arg];
    }
}

今、私はこれについて何の警告も受けていません、そしてそれは私には正しいように見えます。(arg!= nilの場合、クラスが準拠していることを保証できるため、どのような場合でもエラーは発生しません。)

ただし、Xcodeでオートコンプリートが取得されていないため、これが正しい方法かどうか疑問に思います。何かご意見は?(私はインスタンスがid <プロトコル>であることに興味がないことに注意してください。)

4

1 に答える 1

2

特定のプロトコルに準拠しているかどうかを判断したい場合cls(そしてそれがそのプロトコルの必須クラスメソッドであると仮定しclassMethod:た場合)、次のことができます。

- (id)someMethodWithClass:(Class)cls andUseArg:(BOOL)arg
{
    id instance;
    if ([cls conformsToProtocol:@protocol(Protocol)]) {
        instance = [cls classMethod:arg];
    }

    return instance;
}

または、特定のクラスメソッドセレクターに応答するかどうかを確認します。

- (id)someMethodWithClass:(Class)cls andUseArg:(BOOL)arg
{
    id instance;
    if ([cls respondsToSelector:@selector(classMethod:)]) {
        instance = [cls classMethod:arg];
    }

    return instance;
}
于 2012-12-29T07:07:31.100 に答える