5

ブロックを正しい順序で組み合わせてパズルを完成させようとするパズルのようなプログラムがあります。完了したら、再生ボタンを押すと、プログラムがブロックのある場所で小さな男をブロックの上を歩かせます。したがって、上に 1 ブロック、右に 1 ブロック、下に 1 ブロックを配置して再生ボタンを押すと、プログラムは上に移動、右に移動、下に移動のメソッドを呼び出します。

私のプログラムが実行され、どのメソッドをどの順序で呼び出すかを理解しようとすると、プログラムが見つけた順序でこれらのメソッドを保存する必要があります。どのメソッドを呼び出すかを調べないと、ブロック上を移動する人が電光石火の速さで動くので、メソッドをある種のメソッド配列 (ある種のセレクターのようなものだと思っていました) に格納して、各メソッドを呼び出すことができるようにしたいと考えています。私のプログラムがやろうとしていることをすべて把握した後、一定の時間間隔で。

現在の私の通常のプログラムは次のようになります

if(random requirements)
[self moveUp]

else if(random requirements)
[self moveDown]

else if (random requirements)
[self moveRight]

else if(random requirements)
[self moveLeft]

まあ、私はむしろこれがこのように見えることを望みます

if(random requirements)
SEL selector addMethod:[self moveUp]

else if(random requirements)
SEL selector addMethod:[self moveDown]

else if (random requirements)
SEL selector addMethod:[self moveRight]

else if(random requirements)
SEL selector addMethod:[self moveLeft]

明らかにこれは実際の構文ではありませんが、私が探しているものを理解できますか?

4

1 に答える 1

8

複数のセレクターを 1 つのセレクターに格納することはできませんが、セレクターの配列を作成することは完全に有効です。最も簡単な方法は、セレクターの文字列表現を に格納NSMutableArrayし、配列を反復処理するコードで文字列からセレクターを作成することです。

NSMutableArray *selectorNames = [NSMutableArray array];
if(random requirements)
    [selectorNames addObject:NSStringFromSelector(@selector(moveUp))];
if(random requirements)
    [selectorNames addObject:NSStringFromSelector(@selector(moveDown))];
...
for (NSString *selectorName in selectorNames) {
    SEL nextSelector = NSSelectorFromString (selectorName);
    // Now you can invoke your selector
}

セレクター以外の別のオプションは、ブロックを使用することです。ブロックはアクションのカプセル化にも非常に優れており、ターゲットを個別に保存する必要はありません。

于 2012-07-12T17:35:01.947 に答える