[과제2] Swift 숫자 야구 게임 해설(Lv1 ~ 2)

이유진·2024년 3월 18일
0

알게 된 개념 정리

shuffle() 과 shuffled()

  • shuffle(): 원본이 변경되는 값

  • shuffled(): 원본이 변경되지 않는 값. 반환 값은 변경.

    //example
    
    arr.shuffle() //arr 자체가 변경되도록 함
    
    arr.shuffled()
    let shuffledArr = arr.shuffled()
    //arr 자체는 변경되지 않고
    //arr 섞은 값을 shuffledArr에 저장하겠다.
    //즉 저장 값에만 영향을 준다.

배열의 슬라이싱(slicing) []

  • 배열 뒤에 rage[]를 사용해서 배열을 원하는 범위만큼 잘라줄 수 있다.

  • [] 안의 수는 인덱스이다.

  • [index] 이렇게 사용하면 배열에서 index 위치에 해당하는 요소를 가져오는 것을 의미한다.

    arr.shuffled()[0...2]
    
    arr.shuffled()[index]

Subsequence 타입

class baseballGame {

func makeAnswer() -> [Int] {

	let arr = (1...9).map { $0 }
	let shuffledArray = arr.shuffled()
	
	return shuffledArray[0...2]
}

/*
반환값 shuffledArray[0...2]가 
[Int]타입이 아니라
Array Subsequnce 타입이기 때문에 오류 발생.
(지정한 반환 타입과, 실제 반환되는 타입이 다르기 때문에 오류 발생.)

subscript 즉 [0...2]에 range를 통해 전달해서
Array를 잘라오게 되면,[Int] 타입이 되지 않는다.
*/
//이런 경우에는 타입 변환(Type Conversion) 사용

class baseballGame {

func makeAnswer() -> [Int] {

	let arr = (1...9).map { $0 }
	let shuffledArray = arr.shuffled()
	
	return [Int](shuffledArray[0...2])
}

readLine()

  • 사용자로부터 텍스트를 입력 받고 문자열로 반환하는 메서드.
  • 이 때 사용자의 입력이 없을 수도 있고, 입력 받은 값이 문자열일 수도 있고 아닐 수도 있기 때문에 옵셔널 String(String?) 으로 반환을 한다.
    let input = readLine() ?? "" //오류가 나서 nil 값이 들어오면 “” 빈 문자열로 처리해준다.

??
nil 병합 연산자(nil coalescing operator)
옵셔널 값이 nil인 경우에 대체값을 제공하는 데 사용된다.


String의 순회

  • String도 각 요소 순회가 가능하다.
  • 하나씩 순회되어서 값이 출력된다.
    	let input = readLine() ?? ""
    	
    	//123 입력
    	
    	print(input.map { $0 })
    	
    	//["1", "2", "3"] 출력
    	
    	/*
    	클로저 { $0 } 가  input의 각 요소를 순회하도록 하고
    	map은 클로저가 순회한 요소를 배열로 만들어준다.
    	
    	문자열은 문자의 배열처럼 각 문자로 구성되어 있기 때문에
    	클로저가 input을 순회하면서 각 문자를 참조하는 것이 가능하다.
    	
    	이런 과정을 거쳐서 String 타입의 123이
    	배열 ["1", "2", "3"]으로 출력되어 나오는 것!
    	*/

Character 타입 → Int 타입 변환

  • String은 Character 여러 개가 담긴 배열이다!

    	/*
    	여기서 생성된 배열 내부의 값 "1", "2", "3"은 Character 타입이다.
    	
    	Int 생성자는 문자(Character)를 정수로 변환하는 데 사용될 수 없다. 
    	이 생성자는 문자열(String)을 정수로 변환하는 데 사용된다.
    	
    	따라서 print(input.map { Int($0) } 를 하면
    	Character 타입을 받는 생성자가 없다는 오류가 발생한다.
    	
    	오류 없이 정수로 반환하려면
    	1. Character 타입을 String 타입으로 변환한다.
    	2. String 타입을 Int 타입으로 변환한다.
    	*/
    	
    	print(input.map { Int(String($0)) }
    
    	//[1, 2, 3] 출력

고차함수 compactMap

  • 배열의 각 요소에 대해 클로저를 적용하여 변환하고, 그 결과가 nil이 아닌 경우에만 새로운 배열을 생성한다. 옵셔널 값을 다룰 때 유용하다.
    print(input.map { Int(String($0)) }
    
    //[1, 2, 3] 출력
    	
    /*
    주의할 점!
    반환되는 타입은 Int가 아니고 옵셔널 Int 이다.
    클로저에 들어오는 값이 숫자로 변환 불가능한 값이면 
    nil이 반환될 수 있기 때문.
    */
    /*
    nil 값을 제외하고 배열을 만들어주는 compactMap 사용해서
    옵셔널 Int가 아닌 Int 값만 반환하도록 해준다.
    
    나중에 사용 가능하도록 출력하지 않고 상수로 정의해주자.
    */
    
    let numberArray = input.compactMap { Int(String($0)) }

메서드 enumerated()

  • 컬렉션(배열, 딕셔너리 등)의 각 요소에 대해 인덱스와 값(=인덱스에 들어 있는 요소)을 튜플로 반환한다. ex) (index, number) for-in 루프에서 컬렉션의 요소를 순회하면서 인덱스 정보를 함께 활용하고자 할 때 유용하게 사용된다.
    for (index, number) in numberArray.enumerated()

continue

  • 제어문(반복문 또는 스위치문) 내에서 사용되는 키워드이다.
  • 반복문 내부에서 특정 조건을 만족할 때 해당 반복을 중지하고 다음 반복으로 넘어가는 데 사용된다.
    var strike = 0
    var ball = 0
    
    for (index, number) in numberArray.enumurated() {
    
    //스트라이크
    	if number == answer[index] {
    		strike += 1
    		continue
    	}
    
    //ball
    	if answer.contains(number) {
    		ball += 1
    	}
    	
    
    /*
    continue는 
    스트라이크가 나온 경우에는 바로 다음 반복(for)으로 넘어가고, 
    스트라이크가 나오지 않은 경우에는 볼 조건을 검사한 후 다음 반복(for)으로 넘어간다.
    */

Print문의 매개변수 terminator

  • Print 함수는 separator와 terminator Parameter 존재한다.
  • 기본값이 지정되어 있는 것!
  • separator의 타입은 String으로, 기본값은 “ “ 공백이다.
  • terminator의 타입은 String으로, 기본값은 “\n” 줄바꿈 이다.
  • print문을 사용할 때 줄바꿈 하지 않고 한 줄로 출력하고 싶다면 terminator를 공백으로 작성해주면 된다.
  • print(n, terminator: “ “)
    pirnt("\(strike)스트라이크", terminator: " ")
    print("\(ball)볼")
    
    //"(strike)스트라이크 (ball)볼" 출력

논리연산자 &&

  • Boolean 논리 연산자. "AND"를 나타낸다.
  • 두 개의 조건이 모두 참(True)일 때 전체 표현식이 참(True)이 된다.
    if strike == 0 && ball == 0 {
    	print("Nothing")
    	} else if strike == 3 {
    		print("정답입니다!")
    	} else {
    		print("\(strike)스트라이크", terminator: " ")
    		print("\(ball)볼")
    	}

0개의 댓글