IOS(Swift)

[IOS/Swift] MBTI ์นด๋“œ ์„ ํƒ ๊ฒŒ์ž„ UI ๊ตฌํ˜„

Tempo 2022. 5. 22. 15:27

swift ui๋ฅผ ์ด์šฉํ•ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„๋ฅผ ์ง„ํ–‰ ํ•ด๋ด…์‹œ๋‹ค.

๊ฒ€์ƒ‰ ํ™”๋ฉด 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 ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•