見出し画像

続・スタンフォード式iOSアプリ開発講座をやってみた【後編①】

前編ではレクチャー3で扱う概念について、おはなししました。こちらのページでは、実践した内容を振り返りたいと思います。

MemoryGame型

MVVMアーキテクチャのModelに該当する構造体です。
変数プロパティとして、カードの配列が定義されています。このcardsプロパティの値を、型の外部から更新することはできません。

import Foundation

struct MemoryGame<CardContent> {
   private(set) var cards: Array<Card>
   
   func choose(_ card: Card) {
   }
   
   init(numberOfPairsOfCards: Int, createCardContet: (Int) -> CardContent) {
       self.cards = Array<Card>()
       // add numberOfPairsOfCards x 2 cards to array
       for pairIndex in 0..<numberOfPairsOfCards {
           let content = createCardContet(pairIndex)
           cards.append(Card(content: content))
           cards.append(Card(content: content))
       }
   }
   
   struct Card {
       var isFaceUp  = false
       var isMatched = false
       let content: CardContent
   }
}

イニシャライザのcreateCardContentパラメータは、関数を受け取ります。このイニシャライザの呼び出し側では、クロージャ形式で「どんなカードを作成するか」を記述して渡します。作成したカードは2枚ずつ、cards配列に追加されます。

また、ゲームで使用するカードをモデル化した構造体が、ネストしたCard型として定義されています。作成するカードの柄が「どんなデータ型になるか」は、親のMemoryGame型イニシャライザが受け取るcreateCardContentパラメータに基づきます。

この構造体では、関数プログラミングとジェネリクスが使われていますね。

EmojiMemoryGame型

このクラスは、MVVMアーキテクチャのView Modelに該当します。実質的に、このクラスは「Modelの顔」と言えるでしょう。ゲームロジックの本質的な部分は、MemoryGame型によって隠蔽されます。これには、本質的なゲームロジックを応用して、後から他のゲームを作成できるようにする意図があると思われます。

レクチャーを通して作成するMemorizeアプリのビューは、このクラスと介してゲームロジックを駆動することになります。

class EmojiMemoryGame {
   static let emojis = ["🚗", "🚌", "🏎", "🚓", "🚕", "🚒", "🚛", "🚜",
                        "🚍", "🚡", "🚟", "🚃", "🚞", "🚝", "🚄", "🚅",
                        "✈️", "🛰", "🛩", "🚀", "🛸", "⛵️", "🛶", "🚤"]
   
   static func createMemoryGame() -> MemoryGame<String> {
       MemoryGame<String>(numberOfPairsOfCards: 4) { pairIndex  in
               EmojiMemoryGame.emojis[pairIndex]
           }
   }
   
   private var model = EmojiMemoryGame.createMemoryGame()
   
   var cards: Array<MemoryGame<String>.Card> {
       model.cards
   }
}

型プロパティとして、絵文字の配列が定義されています。また、ゲームロジックのインスタンスを作成するメソッドも、型メソッドとして定義されています。型プロパティについては、こちらのページで説明しています。

カードのコレクションであるcardsプロパティは計算プロパティです。モデルから最新のカード情報を取得しています。計算プロパティについては、こちらのページで説明しています。

後編②

レクチャー4では、モデルに変更が発生すると、ビューの表示も自動的に更新される仕組みを導入します。さらに、列挙型とオプショナルを使ったコードも学びます。

この記事が気に入ったらサポートをしてみませんか?