Swift Tuple, Any, Character / mini project

오늘은 캠프에서 열어준 기본 문법 강의 중 제대로 인지하지 못했던 기본 문법을 정리한 후
이전에 만들었던 미니 프로젝트를 다시 한번 복습하며 만들어보았다.

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 버튼을 누를 경우, 모든 값이 처음 준비했던 값으로 돌아갈 수 있도록 설정한 후
컴퓨터가 다시 랜덤으로 가위 바위 보를 선택할 수 있도록 설정해주면 프로젝트가 완성 :)