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()
let input = readLine() ?? "" //오류가 나서 nil 값이 들어오면 “” 빈 문자열로 처리해준다.
??
nil 병합 연산자(nil coalescing operator)
옵셔널 값이 nil인 경우에 대체값을 제공하는 데 사용된다.
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
print(input.map { Int(String($0)) }
//[1, 2, 3] 출력
/*
주의할 점!
반환되는 타입은 Int가 아니고 옵셔널 Int 이다.
클로저에 들어오는 값이 숫자로 변환 불가능한 값이면
nil이 반환될 수 있기 때문.
*/
/*
nil 값을 제외하고 배열을 만들어주는 compactMap 사용해서
옵셔널 Int가 아닌 Int 값만 반환하도록 해준다.
나중에 사용 가능하도록 출력하지 않고 상수로 정의해주자.
*/
let numberArray = input.compactMap { Int(String($0)) }
메서드 enumerated()
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
pirnt("\(strike)스트라이크", terminator: " ")
print("\(ball)볼")
//"(strike)스트라이크 (ball)볼" 출력
논리연산자 &&
if strike == 0 && ball == 0 {
print("Nothing")
} else if strike == 3 {
print("정답입니다!")
} else {
print("\(strike)스트라이크", terminator: " ")
print("\(ball)볼")
}