見出し画像

SwiftUIでいこう!- スタンフォード大学Lecture 4: Game Logic

続いて先に作ってあるContentView等にMVVMで作ったクラスを使って修正していきます。

まず、起動するファイルを決めている以下の構造体を作っていきます。

import SwiftUI

@main
struct SampleAppApp: App {
   
   var body: some Scene {
       WindowGroup {
           ContentView()
       }
   }

実装です。

ViewModelの部分を読み込み、

let game = EmojiGame()

そして

ContentView(viewModel: game)

全体です。

@main
struct SampleAppApp: App {
   
   let game = EmojiGame()
   
   var body: some Scene {
       WindowGroup {
           ContentView(viewModel: game)
       }
   }
}


次にContentView()を置き換えていきます。

let viewModel:EmojiGame

と宣言して"ViewwModel(EmojiGame)"で該当カ所を置き換えていきます。

まず、"var body: some View {}"

ForEach(viewModel.cards){card in
  CardView(card: card).aspectRatio(2/3,contentMode:.fit)
}

Model "struct Game<CardContent>{}"を変更していきます。

 init(numberOfpairOfCards:Int,createCardContent:(Int)->CardContent){
       cards = Array<Card>()
       for pairIndex in 0..<numberOfpairOfCards{
           let content = createCardContent(pairIndex)
           cards.append(Card(id:pairIndex*2, content: content))
           cards.append(Card(id:pairIndex*2+1, content: content))
       }
   }
   
   
   struct Card:Identifiable{
       var id: Int
       var isFaceUp:Bool=false
       var isMatched:Bool=false
       var content:CardContent
   }

init(numberOfpairOfCards:Int,createCardContent:(Int)->CardContent){}の以下の部分。

cards.append(Card(id:pairIndex*2, content: content))
cards.append(Card(id:pairIndex*2+1, content: content))

struct Card{}の以下

struct Card:Identifiable{
   var id: Int
   ・・・・
   ・・・・
   ・・・・
}

以上を前提に

"struct CardView:View"をModelとして作った"Game<CardContent>"で

let card:Game<String>.Card

と宣言して置き換えていきます。

struct CardView:View {

   let card:Game<String>.Card
   
   var body: some View{
       ZStack{
           let shape =  RoundedRectangle(cornerRadius: 20.0)
           if card.isFaceUp{
               shape
                   .fill()
                   .foregroundColor(.white)
               
               shape
                   .stroke(lineWidth: 3)
               Text(card.content)
                   .font(.largeTitle)
           }else{
               shape
                   .fill()
           }
       }

   }
}

上記"CardView:View"の以下の部分、

if card.isFaceUp{}
Text(card.content)


Xcodeのプレビューに必要な

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
       let game = EmojiGame()
       ContentView(viewModel:game)
   }
}
let game = EmojiGame()
ContentView(viewModel:game)

太字の部分を変更しています。






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