TIL 11일 차 - Swift 필수 문법 문제 1번 풀이
<필수 문제 1>

문제 1-1.
- 두 개의 Int 값을 파라미터로 받고, 하나의 String 값을 반환하는 클로저를 설계
- 클로저 내부에서는 두 정수를 더한 후, "두 수의 합은 {합계}입니다"라는 문자열을 반환
- 이 클로저를 상수 sum에 저장하고, 정확한 타입을 명시
내가 쓴 첫 번째 오류투성이 코드 공개
let sum: (Int,Int) -> String = {(Int, Int) -> String
in return "두 수의 합은 \($0 + $1) 입니다."}
여기서 내 멋대로 $0랑 $1을 썼다
근데 오류가 나는 거다 왜 오류가 나지? 했는데 클로저에서 매개변수 선언을 시작했기 때문에 Swift가 자동 파라미터 $0, $1을 만들어주지 않아 사용이 불가하다.
let sum: (Int,Int) -> String = {
"두 수의 합은 \($0 + $1) 입니다."
}
// 처음에 sum이 클로저 타입임을 인지함
// Int 두개를 받고 String을 반환하는 클로저 타입
// 자동으로 $0과 $1를 만듬
내가 두 번째로 쓴 코드
let sum = { (a: Int, b: Int) -> String in
return "두 수의 합은 \(a + b) 입니다."
// 파라미터의 이름을 정해주었고 리턴값에서도 이름을 사용하여 출력 함
// 근데 이건 문제에서 제시한 sum의 타입이 명시되어있지 않음
}
파라미터 이름을 지정해 주고 리턴값에서도 그 이름을 사용하여 출력해 주면 정상적으로 작동한다.
하지만 '정확한 타입을 명시'하라는 문제의 요구사항에 맞지않음
따라서
최종 수정한 풀이는 다음과 같다.
// sum의 타입도 명시하고 클로저 내부 구현도 함
let sum: (Int, Int) -> String = {(a: Int, b: Int) -> String
in return "두 수의 합은 \(a + b) 입니다." // 파라미터 직접 선언
}
문제 1-2.
- 위에서 정의한 sum과 동일한 타입의 클로저를 파라미터로 받고, 반환 값이 없는(void) 함수 calculate를 작성해 주세요
- (조건) calculate 함수 구현 내에서는 파라미터로 전달받은 클로저를 호출하는 코드를 포함해야 합니다.
// 내가 처음에 쓴 코드
func calculate(a: Int, b: Int, closure: (Int, Int) -> String) -> Void {
print(closure(a, b))
}
근데 여기서 든 의문점 하나
왜 구현부에서 클로저를 호출할 때 print()로 감싸야하지? 감싸지 않고 그냥 closure(a, b)만 댕강 쓰면
"Result of call to function returning 'String' is unused"라는 오류가 뜬다... 왤까?
지금 스위프트가 경고문으로 하고 있는 말은 뭐냐 하면 '너는 왜 함수를 불러놓고 String값이 반환됐는데 변수에 집어넣지도 않고 출력도 안 하고 갖다 버리니?라는 것이다. 그래서 그 String값은 버려졌다.....라고 난리를 치는 거임
근데 아무리 생각해도 '아니 return 문자열값이면 내가 나중에 calculate함수를 불러놓고 그 값을 출력해서 쓸 수도 있는 거고 어떤 변수에 담을 수도 있는 건데 왜 난리지?' 싶은 거다. 그래서 더 찾아봤다.
알고 보니 calculate함수의 반환값은 Void라고 설정하였으므로 calculate 함수를 구현할 당시에 closure로 반환된 String값을 활용하지 않으면 파라미터로 받은 클로저를 쓰지도 못하고 그대로 공중분해가 되는 것이다.
따라서 나중에 출력하겠다.라는 말을 애초에 성립하지도 않는 것이다..
그리고 몰랐는데 함수의 출력값이 없을 때 쓰는 -> Void를 생략해도 된다고 한다. 그래서 보기 좋게 -> Void를 삭제해 주었다.
끝나기 전에 또 등장한 $0와 $1
func calculate(closure: (Int, Int) -> String) {
print(closure($0, $1))
}
// 이거는 왜 안될까?
// 일단 $0랑 $1는 클로저 내부에서쓰는거지 함수 본문에서는 쓸 수 없음: 컴파일 에러
// + 매개변수 선언을 생략했을 때만 존재함
// 클로저의 Int, Int는 calculate함수의 매개변수가 아님!!
과제 1 최종 풀이
//과제 1 풀이
// sum의 타입도 명시하고 클로저 내부 구현도 함
let sum: (Int, Int) -> String = {(a: Int, b: Int) -> String
in return "두 수의 합은 \(a + b) 입니다."
}
print(sum(10, 20)) // 두 수의 합은 30 입니다. 출력
func calculate(a: Int, b: Int, closure: (Int, Int) -> String) {
print(closure(a, b))
}
// 함수의 출력값이 없을때 -> Void 생략 가능
'iOS > Swift ' 카테고리의 다른 글
| [iOS- Swift] 스위프트 필수 문법 문제 3번 풀이 (0) | 2026.01.09 |
|---|---|
| [iOS- Swift] 스위프트 필수 문법 문제 2번 풀이 (0) | 2026.01.09 |
| [iOS-Swift] 타입캐스팅 (0) | 2026.01.09 |
| [iOS-Swift] 접근 제어자 (0) | 2026.01.08 |
| [iOS-Swift] 중첩타입 (0) | 2026.01.08 |