14일 만에 아이폰 앱 만들기(11) - State Properties
지난 포스팅에서 카드게임의 버튼을 만드는 것까지 진행했다. 이제는 각자 카드에 해당하는 데이터를 컨트롤하도록 해보자.
카드게임 프로젝트를 불러오자.
ContentView에 property를 추가로 입력해 주자. ContentView struct 내에서 저 값들을 참조할 수 있다.(같은 scope이기 때문)
카드 이미지를 불러올 때 이제 문자열이 아닌 변수를 통해서 불러오도록 하자.
점수도 마찬가지로 불러오면 되는데 Int값을 String값으로 변경해주어야 한다.
이제 버튼을 클릭할 때 저 변수의 값들이 변경하게 하면 된다. 그렇게 하기 위해서 버튼의 클로저의 내용을 바꿔보자. 일단 playerCard 변수의 텍스트를 변경하기 위해 버튼이 action에 다음과 같이 입력하였다.
Button(action: {
// Update the cards
playerCard = "card3" // 오류 발생
cpuCard = "card12" // 오류 발생
// Update the scores
playerScore += 1 // 오류 발생
cpuScore += 1 // 오류 발생
}, label: {
Image("dealbutton")
})
property를 변경하려고 하면 오류가 뜰 것이다. struct내에서 property는 기본적으로 변경을 하지 못하게 되어있다. 변경이 가능하게 만들어주려면 해당 property의 var 키워드 앞에 @State라고 적어준다. 그러면 이제 해당 property는 값을 변경할 수 있게 된다.
그리고 추가로 @State 뒤에 private까지 추가 해주어야 한다. 왜냐면 값이 함부로 변경되면 안 되기 때문이다. struct 내부에서만 변경될 수 있게 하기 위해 private 키워드를 추가하자.
이제 오류가 사라졌을 것이다. 시뮬레이션을 돌려보자. 버튼을 누를 때 카드와 점수가 바뀌면 제대로 하고 있다는 것이다.
버튼을 누르면 계속 점수는 올라가고 카드는 한 번만 바뀌지 계속 바뀌진 않을 것이다. 일단 카드는 계속 랜덤하게 변경되어야 한다. 그렇게 하기 위해서는 랜덤하게 수를 만들어내는 함수를 사용해야 한다.
카드 번호는 2에서 13까지 있기 때문에 이 안에서 랜덤하게 수를 생성해야 한다.
랜덤하게 숫자가 생성이 되고 card라는 텍스트와 합쳐져서 결국엔 카드 이미지의 이름이 되는 것을 볼 수 있다. 그리고 숫자는 Int 타입이기 때문에 String으로 변경해주어야 했다. 이제 버튼을 누를 때마다 playerCard와 cpuCard에는 card1~ car14의 텍스트가 랜덤하게 들어갈 것이다. 시뮬레이션을 보도록 하자.
현재 점수는 계속 올락간다. 이거는 다음 포스팅에서 if구문을 배워보고 진행하도록 하겠다.
지금까지 View코드에서 property를 사용하는 것, @State 지정하는 법, 값의 변경 가능 여부 등에 대해 알아보았다.
끝!
'14일 만에 아이폰 앱 만들기' 카테고리의 다른 글
14일 만에 아이폰 앱 만들기(13) - Challenge (0) | 2021.01.13 |
---|---|
14일 만에 아이폰 앱 만들기(12) - If Statements (0) | 2021.01.12 |
14일 만에 아이폰 앱 만들기 챌린지(10) - SwiftUI Buttons (0) | 2021.01.10 |
14일 만에 아이폰 앱 만들기 챌린지(9) - Instances (0) | 2021.01.09 |
14일 만에 아이폰 앱 만들기 챌린지(8) - Structures (0) | 2021.01.08 |