![見出し画像](https://assets.st-note.com/production/uploads/images/53500539/rectangle_large_type_2_f96630389d08a86793b66ab8d9dc8019.png?width=1200)
続・スタンフォード式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では、モデルに変更が発生すると、ビューの表示も自動的に更新される仕組みを導入します。さらに、列挙型とオプショナルを使ったコードも学びます。