ブロックをコールバック関数として使用したい。これまでのところ、単純なコールバック関数として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
内部。
これは可能ですか?
「NSNumber」を使用するとうまくいきましたが、正しいことの良い兆候であることは思い出して明らかです。おかげでロブ。 –