0

わかりました - ここで何が起こっているのかよくわかりません。シンプルなカードゲームを作っています。「カード」が必要とするすべてのものを処理する UIView のカテゴリを作成しました。これは無関係だと思いますが、おそらくそうではありません。

とにかく、私のView Controllerでは、ディーラーとプレイヤーの手を握るために2つのNSMutableArrayを作成しています。次に、カードの値を設定するメソッドを呼び出しています。そのメソッドでは、特定のカード オブジェクトの値を確認するために NSLog を実行します。しかし、View Controller からその値を取得しようとすると、配列内の最後のオブジェクトの値を持つすべてのオブジェクトに対して常に返されます。

いくつかのコード:

playersCards = [[NSMutableArray alloc] initWithObjects:[[UIView alloc] init],[[UIView alloc] init],nil];

[[playersCards objectAtIndex:0] setCardValue];
[[playersCards objectAtIndex:1] setCardValue];

NSLog(@"1: %i",[[playersCards objectAtIndex:0] returnValue]);
NSLog(@"2: %i",[[playersCards objectAtIndex:1] returnValue]);

したがって、setCardValue (これはカテゴリ内にあります) を呼び出した後に NSLog を取得すると、すべて問題ありません。しかし、それらの NSLog はすぐそこにあり、両方のインデックス 1 の値を返します。ここで何が起こっているのですか?

4

1 に答える 1

4

setCardValue複雑な処理を行っていない限り、カードがどのインデックスにあるかをメソッドが知る方法はありません。したがって、カードが 2 枚ある可能性がありますが、それらは同じように初期化されています。

ただし、ここにはさらに大きな問題があります。UIViewインスタンスをこのようなデータとして使用することは本当に望ましくありません。ゲームの状態を保持するビット [モデル] から、画面上に要素をレンダリングするビット [ビュー] を分離する必要があります。通常、ビュー [コントローラー] とのユーザー インタラクションに基づいてモデルの状態を管理するレイヤーが間にあります。

詳細については、 Model-View-Controllerのドキュメントを参照してください。


カテゴリを使用して既存のクラスから何かをぶら下げるのは便利に思えるかもしれませんが、アプリケーションでデータ、状態、および/またはロジックをカプセル化するための主要なパターンとして実際に使用するべきではありません。

そのデータ [ゲームの状態] を画面上でのデータの描画方法 [ビュー] から分離したままにしておくことが本当に必要です。

あなたのコメントの特定の質問に関して、別の質問:

コードが次のように記述されていると想像してください。

Card *c = [cardArray objectAtIndex: 0];
[c doSomething];

cそのコードのどのインデックスにあるかをどのように知ることができますか? ここで、上記のコードは と同じであることに注意してください[[cardArray objectAtIndex:0] doSomething];

ある種のカード ゲームを設計している場合、いくつかのクラスを作成する可能性があります。

  • Card単にスーツと値を格納するクラス。アーカイブ目的で NSCoding をサポートします。

  • そのCardViewサブクラスはUIView、スーツと値が与えられると、カードをレンダリングする方法を知っています。

  • GameFieldViewプレイフィールドを描画する方法 (以前は UIView サブクラス)とGameFieldController、プレイフィールドで CardView を移動する方法 (後者は UIViewController) を知っているクラスのセット

  • の特定のサブクラスはGameFieldController、ハンド、スタック、パイル、および/またはカード ゲームを作成するために必要なその他のもののロジックを追加します。

....など....

つまり、ゲームを iOS または OS X モデルのビュー コントローラー パターンに適合する一連のクラスに分割して、最小限のコードを記述し、システムが設計された重い作業をシステムに任せることができます。行う。

これはやり過ぎのように思えるかもしれませんが、実際には、個々のクラスは比較的単純で非常に柔軟です。

于 2013-05-18T05:59:59.207 に答える