swift ui๋ฅผ ์ด์ฉํด ์ดํ๋ฆฌ์ผ์ด์ ์ค๊ณ๋ฅผ ์งํ ํด๋ด ์๋ค.
๊ธฐํ๋ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ฌธ์๋ ๋๋ ์ธ๊ธ๋์ ๋น๊ตํ ๋ ๊ฐ์ ํญ๋ชฉ์ ๊ฐ๊ฐ ์นด๋๋ก ๋ณด์ฌ์ค๋๋ค.
- ํญ์ ์๋์ ์๋ ์นด๋(ํ๋)๊ฐ ์์ ์๋ ์นด๋(๋นจ๊ฐ) ๋ณด๋ค ์ธ๊ธ๋์ด ๋ ๋ง์์ง ๋ฎ์์ง๋ฅผ ์ ํํฉ๋๋ค.
- ์ ๋ต์ ๋ง์ถ๋ฉด ๋ค์ ์นด๋๋ก ์ด๋, ์๋ชป ์ ํํ๋ฉด ๊ฒ์์ด ๋๋ฉ๋๋ค.
๋ฐ์ดํฐ ๊ตฌ์ฑ
๊ฒ์์ ๊ตฌ์ฑํ๋ ๋ฐ์ดํฐ(API ์ ๋ฌ ๊ฒฐ๊ณผ)๋ฅผ ์ค๊ณํด๋ด ์๋ค.
struct StageList: Codable {
var data: Array<String>
var answer: Array<Int>
}
API์์ ์๋ต๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ Struct๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ค์ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{
"data": ["์ง์ฅ๋ฉด", "์งฌ๋ฝ", "ํ์์ก", "์ ๋ฆฐ๊ธฐ", "๊ฟ๋ฐ๋ก์ฐ"],
"answer": [100, 1000, 1200, 500, 400]
}
๊ฐ ๋ฆฌ์คํธ์ ํญ๋ชฉ๋ค์ด ์นด๋ ํญ๋ชฉ์ผ๋ก ์์ฐจ์ ์ผ๋ก ์์ฑ๋ฉ๋๋ค. ์๋ฅผ๋ค์ด data[0], data[1]์ด ์นด๋๋ก ์์ฑ๋ฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ์ฝ๋ ์ ์ฒด๋ฅผ ์์ฑํด๋ด ์๋ค.
//
// GameView.swift
// mbtiRankGame
//
// Created by ๋ฐ์ข
ํ on 2022/05/15.
//
import SwiftUI
struct GameView: View {
var data: StageList
@State private var firstCard = false
@State private var secondCard = true
@State private var isFirstCard = false
@State private var cardX: CGFloat = UIScreen.main.bounds.width
@State private var topCardY:CGFloat = CGFloat(150)
@State private var secCardY:CGFloat = CGFloat(150 + UIScreen.main.bounds.height * 0.4)
@State private var stage: Array<String>
@State private var answer: Array<Int>
@State private var firstText: String
@State private var secondText: String
@State private var firstCount: Int
@State private var secondCount: Int
@State private var showCount = false
@State private var showAlert = false
@State private var showGameEnd = false
// ํด๋์ค ์ด๊ธฐํ ์ ํ ๋น๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํจ. data๋ ์์ json ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
init(data: StageList){
self.data = data
self.stage = data.data
self.answer = data.answer
self.firstText = data.data[0]
self.secondText = data.data[1]
self.firstCount = data.answer[0]
self.secondCount = data.answer[1]
}
func checkStage(isSmall: Bool) -> (Bool, Bool){
var res: Bool
var isNext = true
// if (self.answer.count < 3){
// isNext = false
// return (false, isNext)
// }
if (self.answer[1] == self.answer[self.answer.count - 1]){
isNext = false
}
if (self.answer[0] < self.answer[1]){
res = isSmall ? true: false
} else {
res = isSmall ? false: true
}
return (res, isNext)
}
func changeStatus() {
self.firstCard.toggle()
self.secondCard.toggle()
self.stage.removeFirst()
self.answer.removeFirst()
}
var body: some View {
VStack{
ZStack{
CardItem(firstCard: true, isFirst: self.firstCard, targetText: self.firstText, targetCount: self.firstCount, isShowCount: showCount ? false : true)
CardItem(firstCard: false, isFirst: self.secondCard, targetText: self.secondText, targetCount: self.secondCount, isShowCount: showCount ? true : false)
}
HStack{
Button(action: {
let (res, isNext) = self.checkStage(isSmall: true)
if (isNext==false){
showGameEnd = true
showCount.toggle()
}else{
if (res==true){
self.changeStatus()
if (self.isFirstCard != true){
self.firstText = self.stage[1]
self.firstCount = self.answer[1]
self.isFirstCard = isFirstCard ? false : true
}else{
self.secondText = self.stage[1]
self.secondCount = self.answer[1]
}
showCount.toggle()
}else{
showAlert = true
}
}
}){
Text("๋ ๋๋ค")
}.alert("ํ๋ ธ์ต๋๋ค.", isPresented: $showAlert){
Button("OK", role: .cancel){}
}.alert("๊ฒ์์ด ์ข
๋ฃ๋์ต๋๋ค.", isPresented: $showGameEnd){
Button("OK", role: .cancel){}
}
Button(action: {
let (res, isNext) = self.checkStage(isSmall: true)
if (isNext==false){
showGameEnd = true
showCount.toggle()
}else{
if (res==false){
self.changeStatus()
if (isFirstCard == true){
showCount.toggle()
self.firstText = self.stage[1]
self.firstCount = self.answer[1]
}else{
isFirstCard = isFirstCard ? false : true
self.secondText = self.stage[1]
self.secondCount = self.answer[1]
}
}else{
showAlert = true
}
}
}){
Text("๋ ๋ฎ๋ค")
}.alert("ํ๋ ธ์ต๋๋ค.", isPresented: $showAlert){
Button("OK", role: .cancel){}
}.alert("๊ฒ์์ด ์ข
๋ฃ๋์ต๋๋ค.", isPresented: $showGameEnd){
Button("OK", role: .cancel){}
}
}
}
}
}
struct GameView_Previews: PreviewProvider {
static var previews: some View {
GameView(data:ModelData().stageList)
}
}
์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ Swift UI์์ ๋ฐ๊ฒฌํ ๊ฐ๋ฐ ๋ด์ฉ์ ์ ๋ฆฌํด๋ดค์ต๋๋ค.
ํด๋์ค ์ด๊ธฐํ ์ ๋ณ์ ํ ๋น
...
init(data: StageList){
self.data = data
self.stage = data.data
self.answer = data.answer
self.firstText = data.data[0]
self.secondText = data.data[1]
self.firstCount = data.answer[0]
self.secondCount = data.answer[1]
}
View ํด๋์ค ๋ด๋ถ์์ data, stage, ๋ฑ์ ๋ณ์๋ @State private ๋ณ์์ง๋ง ์ ์ธ๋ง ๋ ๊ฐ์ด์์ต๋๋ค. ์ฌ๊ธฐ์ init ํจ์๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ๊ณ View ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ์์ต๋๋ค.