2011-12-05 9 views
3

ブロックをコールバック関数として使用したい。これまでのところ、単純なコールバック関数としてObj Cのポリモーフィックなプロパティブロック

MyParameter * param = [[MyParameter alloc] init]; 
[param setCallback:^(float value) { [self doSomethingWithValue:value]; }]; 

@interface MyParameter 
{ 
    float myValue; 
    void (^callback)(float); 
} 
@property(copy) void (^callback)(float); 
@end 

@implementation MyParameter 
@synthesize callback; 

- (void) valueChanged 
{ 
    callback(myValue); 
} 
@end 

は、その後、私は、コールバックを設定します。私は、コールバックん私のクラスのプロパティとしての私のブロックを格納します。実際には、MyParameterは、実行時に決定された数の異なるタイプのパラメータの詳細を保持する一般的な抽象化です。連続値(float)、離散値(int)、ブール値を持つことができます。だから次に、私はこれを試しました:

@interface MyParameter 
{ 
    float floatVal; 
    int intVal; 
    void (^contCallback)(float); 
    void (^discCallback)(int); // And a boolean one too but let's keep this short 
    ParamType type; // enum of types ie enum ParamType { Continuous, Discrete, Boolean }; 
} 
@property(copy) void (^contCallback)(float); 
@property(copy) void (^discCallback)int); 
@end 

@implementation MyParameter 
@synthesize contCallback; 
@synthesize discCallback; 

- (void) valueChanged 
{ 
    switch (type) { 
    case Continuous: 
     contCallback(floatVal); 
     break; 
    case Discrete: 
     discCallback(intVal); 
     break; 
    // Leave default out for brevity 
    } 
} 
@end 

どちらが醜いですか。私はivar/propertyとしてただ一つの^callbackを残したいと思います。私は、このようにそれを設定したい:私のvalueChangedメソッドがコールバックに渡すかを決定するために、上からswitch/caseを維持するだろう

MyParameter *contParam = [[MyParameter alloc] init]; 
[contParam setCallback:(^float value) { [self doSomethingContinuous:value]; }]; 

MyParameter *discreteParam = [[MyParameter alloc] init]; 
[discreteParam setCallback:(^int value) { [self doSomethingDiscrete:value]; }]; 

MyParameter内部。

これは可能ですか?

答えて

2

パラメータをNSNumberとして渡します。 -objCTypeを使用して元のタイプを復元できます。type encodingを示す文字列が返されます。このようにして、関数呼び出しをポリモーフする必要はありません。

NSNumberが柔軟性に欠けると判明した場合は、必要な情報をエンコードする独自のArgumentデータクラスを作成してください。必要に応じて、戻りタイプのデータクラスResultを作成することもできます。

+0

「NSNumber」を使用するとうまくいきましたが、正しいことの良い兆候であることは思い出して明らかです。おかげでロブ。 –

関連する問題