오늘은 캠프에서 열어준 기본 문법 강의 중 제대로 인지하지 못했던 기본 문법을 정리한 후
이전에 만들었던 미니 프로젝트를 다시 한번 복습하며 만들어보았다.
Tuple
튜플은 여러 값들을 그룹화 하는데 사용되는 데이터 타입
여러 값들을 한번에 전달하고 반환할 수 있으며, 서로 다른 타입의 요소들을 포함할 수 있다.
let person: (String, Int, Character) = ("John", 30, "M")
Any
Any는 다양한 데이터 타입의 값을 수용할 수 있으며,
이를 통해 배열로 만들 시 여러 타입을 담을 수 있다.
Any 데이터형을 대입하려면 반드시 형 변환이 필요
func printValue(_ value: Any) {
print(value)
}
printValue(5) // Int
printValue("Hello") // String
printValue(true) // Bool
Any는 모든 타입을 전부 수용함에 있어 유연성은 제공되지만, 안전성은 떨어져
특별한 상황이 아닌 경우엔 타입을 명시하고 사용하는 편이 좋다.
Character
Character 는 하나의 문자를 표현하는 데이터 타입이다. "" 로 감싸 단일 문자로 나타내며
String으로 변환하면서 이를 전부 나타낼 수도 있다.
let oneA: Character = "A"
let lunchMenu: [Character] = ["s", "u", "s", "h", "i"]
let lunch = String(lunchMenu)
print(lunch) // sushi
mini project
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var mainLabel: UILabel!
@IBOutlet weak var comChoiceLabel: UILabel!
@IBOutlet weak var myChoiceLabel: UILabel!
@IBOutlet weak var comChoiceImage: UIImageView!
@IBOutlet weak var myChoiceImage: UIImageView!
이미지 내 확인되는 변경되어야 할 부분 및 변수로 설정하여 추후 변동해야하는 값을 IBOutlet
을 통해 연결
var comChoice: Rps = Rps(rawValue: Int.random(in: 0...2))!
var myChoice: Rps = Rps(rawValue: Int.random(in: 0...2))!
조금 더 깔끔하게 코드를 구현하기 위해 Rps 라는 파일을 별도로 만들어 열거형을 통해 "가위 , 바위 , 보"를 세팅해둔 후
나와 컴퓨터 선택의 변수를 선언하며 Rps 값을 랜덤으로 저장해둔다.
override func viewDidLoad() {
super.viewDidLoad()
mainLabel.text = "선택하세요"
comChoiceLabel.text = "준비"
comChoiceImage.image = #imageLiteral(resourceName: "ready")
myChoiceLabel.text = "준비"
myChoiceImage.image = #imageLiteral(resourceName: "ready")
}
앱이 실행하자 마자 가장 먼저 실행되는 viewDidLoad
영역에는 메인 레이블과 컴퓨터, 나의 준비 상태를 표시하는 이미지와 텍스트를 삽입한다.
@IBAction func rpsButtonTapped(_ sender: UIButton) {
let title = sender.currentTitle!
switch title {
case "가위":
myChoice = Rps.scissors
case "바위":
myChoice = Rps.Rock
case "보":
myChoice = Rps.paper
default:
break
}
}
초록색 세개의 버튼을 누를 경우 나의 선택을 결정하는 것이므로 내가 선택한 값을 저장해야 한다.
버튼을 누르면 sender
를 통해 그 버튼의 Title 이 입력되며, 이 Title 값을 이전에 설정해뒀던 Rps 값과 연결한다.
Rps의 값이 enum으로 구성되어있기 때문에 switch 문을 사용하기 용이하다.
@IBAction func selectButtenTapped(_ sender: UIButton) {
switch comChoice {
case .Rock:
comChoiceImage.image = #imageLiteral(resourceName: "rock")
comChoiceLabel.text = "바위"
case .paper:
comChoiceImage.image = #imageLiteral(resourceName: "paper")
comChoiceLabel.text = "보"
case .scissors:
comChoiceImage.image = #imageLiteral(resourceName: "scissors")
comChoiceLabel.text = "가위"
}
switch myChoice {
case .Rock:
myChoiceImage.image = #imageLiteral(resourceName: "rock")
myChoiceLabel.text = "바위"
case .paper:
myChoiceImage.image = #imageLiteral(resourceName: "paper")
myChoiceLabel.text = "보"
case .scissors:
myChoiceImage.image = #imageLiteral(resourceName: "scissors")
myChoiceLabel.text = "가위"
}
if myChoice == comChoice {
mainLabel.text = "비겼다"
} else if myChoice == .Rock && comChoice == .scissors {
mainLabel.text = "이겼다"
} else if myChoice == .paper && comChoice == .Rock {
mainLabel.text = "이겼다"
} else if myChoice == .scissors && comChoice == .paper {
mainLabel.text = "이겼다"
} else {
mainLabel.text = "졌다"
}
SELECT 버튼을 클릭했을 경우, 이전에 저장했던 컴퓨터의 선택 값(comChoice) 내가 선택한 값(myChoice)을 각각
이미지와 표시하는 레이블에도 나타낼 수 있도록 switch 문을 사용하여 연결해준 후
if문을 통해 실질적으로 comChoice 와 myChoice가 결과를 낼 수 있도록 식을 설정해준다.
@IBAction func resetButtenTapped(_ sender: UIButton) {
mainLabel.text = "선택하세요"
comChoiceLabel.text = "준비"
comChoiceImage.image = #imageLiteral(resourceName: "ready")
myChoiceLabel.text = "준비"
myChoiceImage.image = #imageLiteral(resourceName: "ready")
comChoice = Rps(rawValue: Int.random(in: 0...2))!
}
마지막으로 RESET 버튼을 누를 경우, 모든 값이 처음 준비했던 값으로 돌아갈 수 있도록 설정한 후
컴퓨터가 다시 랜덤으로 가위 바위 보를 선택할 수 있도록 설정해주면 프로젝트가 완성 :)
'◽️ Programming > T I L' 카테고리의 다른 글
프로퍼티 옵저버 (didSet , willSet) , 타입 캐스팅 (is , as) (0) | 2024.03.10 |
---|---|
델리게이트 패턴 , 텍스트 필드 (0) | 2024.03.07 |
Swift (옵셔널 체이닝, Queue , Stack , Set , Overloading) (2) | 2024.03.06 |
Type 오류 , Button Style 설정으로 인한 오류 해결 (0) | 2024.03.05 |
Swift TIL ( 사운드 플레이 , 타이머 구현 ) (0) | 2024.03.04 |