3

次のようなブロックのようなプロパティを定義できることはわかっています。

self.myProperty = ^(){
   // bla bla bla        
};

それを配列に保存する

NSArray *arrayOfBlocks = [[NSArray alloc] initWithObject:[self.myProperty copy]];

そして、それを使用して実行します

void (^ myblock)() = [arrayOfBlocks objectAtIndex:0];
myblock();

しかし、ブロックにパラメーターがある場合はどうでしょうか?

つまり、次のようなブロックです。

self.myProperty = ^(id myObject){
   // bla bla bla        
};

私が欲しいのは、この行を変更せずに維持できることです

void (^ myblock)() = [arrayOfBlocks objectAtIndex:0];
myblock();

// yes, I know I can replace myblock(); with myblock(object);
// but because I have a large number of blocks on this array, I will have to build
// a huge if if if if statements to see what block is being run and change the objects passed

私が欲しいのは、ブロックを配列にパラメーターとともに保存することです...次のようなものです:

NSArray *arrayOfBlocks = [[NSArray alloc] initWithObject:[self.myProperty(object?) copy]];

これは可能ですか?

4

1 に答える 1

5

幸いなことに、ブロックは第一級の値です。特定のオブジェクトで呼び出されるブロックを返すファクトリ メソッドを作成できます。

typedef void (^CallbackBlock)(void);
- (CallbackBlock)callbackWithNumber:(int)n
{
    return [^{
        NSLog(@"Block called with %d", n);
    } copy];
}

使用法:

[mutableArray addObject:[self callbackWithNumber:42]];
[mutableArray addObject:[self callbackWithNumber:1337]];

// later:
CallbackBlock cb = [mutableArray objectAtIndex:0];
cb();
于 2013-05-01T22:50:32.813 に答える