요구사항
아래는 카드 세트을 코드로 표현한 것. 해당 코드를 기반으로, 두 개의 Rank 를 가지고 Rank의 값을 비교하는 함수 만들기
enum Rank: Int {
case ace = 1
case two, three, four, five, six, seven, eight, nine, ten
case jack, queen, king
func simpleDescription() -> String {
switch self {
case .ace:
return "ace"
case .jack:
return "jack"
case .queen:
return "queen"
case .king:
return "king"
default:
return String(self.rawValue)
}
}
}
let ace = Rank.ace
let aceRawValue = ace.rawValue
내 답안
// 두 개의 argument 를 취해 값을 비교한 후 true/false 를 return 하는 함수 만들기
func isFirstsBigger(first: String, second: String) -> Bool {
// 기본 코드의 ace 와 aceRawValue instance 처럼 argument 들을 instance 화 하기
var first = "Rank.\(first)"
var second = "Rank.\(second)"
var firstRawValue = "\(first).rawValue"
var secondRawValue = "\(second).rawValue"
// rawValue instance 들을 비교하기
return firstRawValue > secondRawValue
}
// 함수 실행하기
isFirstsBigger(first: "queen", second: "king")
결과는 오답!!
풀이
ChatGPT에게 요구사항에 부합하는지 채점을 요청하니 틀렸다고 하며 아래와 같이 엄청 심플한 방식을 알려준다.
Your function currently takes String arguments and attempts to construct Rank values from them incorrectly. Here's the corrected approach:
// Rank 를 직접적으로 사용하는 함수 만들기 func isFirstBigger(first: Rank, second: Rank) -> Bool { // 값 비교하기 return first.rawValue > second.rawValue } // 함수 실행하기 isFirstBigger(first: .queen, second: .king)
내가 하려고 한 방식은 기본 코드에서 ace 와 aceRawValue 라는 instance 들을 뽑아냈던 것처럼 argument 에서 값들을 instance 로 뽑아내 비교하는 것이었는데 이 방식으로 하려면 아래와 같이 해야 한다고 한다.
- argument 로 넣는 string 들을 모두 case 화하기
- 각 case 와 rawValue 들을 매칭하기 : 이 단계에서 처음 보는 method 가 나왔다!
- 매칭된 값들을 비교하기
배운 것
- function 에 argument 를 부여할 때 enum 을 바로 넣을 수 있다.
- string 과 enum 의 값을 비교하기 위해서는 string 들을 case 화 해야 한다.
- enum 의 값을 함수에 사용할 때는 case 화된 형태로 사용해야 하므로 "." 를 붙인다.
e.g ) isFirstBigger(first: .queen, second: .king)
출처
The Swift Programming Language (Swift 5.7)Apple Inc.
https://books.apple.com/kr/book/the-swift-programming-language-swift-5-7/id881256329
이 자료는 저작권에 의해 보호됩니다.