0

私は同様の質問をしましたが、それらはすべて、配列の特定の値にブロックを使用することに関係していました。これは少し異なります。初期化時にブロックを使用して配列の値を入力したいと思います。これを行うためにNSArrayをサブクラス化する以外に、これに似た別の方法があります。このシナリオでは、今日が常に真ん中にある曜日を配列に入力します。これを行う私の「古典的な」方法は次のようになります。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
[dateFormatter setDateFormat:@"EEEE"];   
NSMutableArray *test = [[NSMutableArray alloc] init];
for (int i = -3; i < 4; i++) {
    [test addObject:[dateFormatter stringFromDate:[[NSDate date] dateByAddingTimeInterval:60*60*24*i]]];
}

理想的には、配列を初期化し、ブロックを使用して動的に割り当てられる値を配列に入力します。たとえば、次のようになります。

NSArray *array = [[NSArray alloc] initWithObjects:^(){  for (int i = -3; i < 4; i++) {
    return [dateFormatter stringFromDate:[[NSDate date] dateByAddingTimeInterval:60*60*24*i]];
}}, nil];

上記のコードは何も作成しません。メソッドinitWithObjectsはブロックではなくオブジェクトを予期しているため、さらに、ブロックは1回実行され、1つのオブジェクトのみが返されます。それで、これは可能/実行可能ですか、それともinitWithBlockのようなメソッドを作成するためにNSArrayをサブクラス化する必要がありますか?

4

1 に答える 1

3

メソッドを追加するために NSArray をサブクラス化する必要はありません。カテゴリで十分です。

あなたが望むことは、現在の NSArray メソッドでは不可能です。また、言語はブロック(または関数またはメソッド)からの複数の戻り値をサポートしていないため、質問で下書きしたとおりには機能しません。したがって、実際に NSArray を作成してそれを返すブロックを作成する必要があります。しかし、それを行う場合は、ブロックを省略して、すぐに配列を作成することもできます。

于 2012-06-13T12:38:54.607 に答える