公開中のアプリ

[Swift]Dictionary(辞書)にkeyとvalue(値)をセットで追加する方法

今回は複数の配列をループさせてDictionaryにkeyとvalueをセットで格納していく方法を試してみたいと思います。

トランプをイメージして作って見ました。
今回プレイヤーは2人です。
全てのカードを交互に配ったら、ランダムにハート、クラブ、ダイヤ、スペードのカードが配られると思います。
その結果をプレイヤー1とプレイヤー2で分けて下記のようにDictionaryに格納したいと思います。

プレイヤー1
[“heart”: [3, 7, 12, 4, 11, 13, 9], “club”: [11, 6, 4, 9, 8, 1, 12], ”diamond”: [8, 5, 10, 13, 12, 2], “spade”: [7, 5, 9, 6, 11, 2] ]

プレイヤー2
[ “heart”: [2, 5, 10, 1, 6, 8], “club”: [13, 7, 3, 10, 5, 2], “diamond”: [9, 6, 7, 4, 11, 3, 1] “spade”: [10, 4, 8, 3, 12, 13, 1] ]

まずはコードを確認

var heart = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
var club = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
var diamond = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
var spade = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
var player1: [String: [Int]] = [:]
var player2: [String: [Int]] = [:]
var n = 0

func start() {
    shuffle(cards: heart, mark: "heart")
    shuffle(cards: spade, mark: "spade")
    shuffle(cards: club, mark: "club")
    shuffle(cards: diamond, mark: "diamond")
    print(player1)
    print(player2)
}

func shuffle(cards: [Int], mark: String) {
    let shuffleCards = cards.shuffled()
  
    for value in shuffleCards {
        if n % 2 == 0 {
            player1[mark] = player1[mark] ?? []
            player1[mark]!.append(value)
            n += 1
        } else {
            player2[mark] = player2[mark] ?? []
            player2[mark]!.append(value)
            n += 1
        }
    }
}
start()

マーク別に配列を作成&プレイヤー別で空のDictionary(辞書)を作成

1〜4行目でマーク毎に4つの配列を作成しました。
5〜6行目でplayer1とplayer2分けてDictionaryを作成しました。
マーク毎に配列をループさせてplayer1とplayer2に格納していきます。

配る処理をスタートさせる関数を作成

9行目〜16行目がそれに当たります。
ここではstart()と言う関数名にしています。
このstart()の中では後で出てくる、shuffle()と言う関数を実行するようになっています。

それぞれ実行された後にplayer1とplayer2の中身をプリントして表示させています。

関数shuffle()を作成

18行目〜32行目では関数start()の中に出てくる関数shuffle()の中身を書いています。
順番に説明していきます。
18行目でまず宣言していて、shuffle()の引数cards:の部分に配列、mark:の部分にマーク名がくるように書きます。
10行目に書いてるshuffle(cards: heart, mark: “heart”)を例にすると、cards: heartとなっているのでcardsに配列heartが代入されて、mark: “heart”となっているのでmarkに”heart”が代入されています。

19行目ではcardsをシャッフルしてshuffleCardsに代入しています。
配列名.shuffled()で配列がシャッフルされます。
10行目を例にすると配列heartがランダムされてshuffleCardsに代入されました。

21行目で、for分を使いshuffleCardsをループさせます!
22行目でplayer1とplayer2に交互に配る為の条件分岐を書いています。
簡単に説明すると、変数nが2で割れる場合はplayer1へ、割れない場合はplayer2へ処理を分岐しています。

23行目と24行目で詰まりました、、、
最初は23行目は書かずに24行目のplayer1[mark]!.append(value)だけ書いていましたが、それだとエラーになりました。

色々調べると、player1[mark]がnilだからappendは無視されると言う事でした。
それで解決策が23行目です、player1[mark]が??(nil)の場合[]初期化してねって処理をしてあげると追加できました。

ここの処理はif文の方が理解しやすかったのでif文での書き方も載せておきます。
if文ではplayer1[mark]がnilの場合player1[mark] = [value]で一個だけ値を代入しておきます。
これで2回目以降のループはnilじゃなくなるのでplayer1[mark]!.append(value)が無視されなくなり、追加する事ができました!

if player1[mark] == nil {
           player1[mark] = [value]
        } else {
            player1[mark]!.append(value)
        }

まだまだ初心者なのでこれくらいの事で行き詰まってしまうけど、この格闘が無駄じゃない事を信じたい・・・
もっとスマートな方法があればご教授お願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

アプリ