
The Swift Programming Language 의 A Swift Tour - Functions and Closures 를 한국어로 번역하여 정리한 것이며, 오역 및 오타가 있을 수 있습니다.
함수와 클로저 (Functions and Closures)
Swift 에서는 func 키워드를 사용하여 함수를 선언합니다. 함수를 호출할 때는 함수 이름 뒤에 괄호로 인자를 넘겨줍니다. 함수의 파라미터와 반환 타입은 -> 기호를 사용하여 구분합니다.
func greet(person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")
Experiment
위 함수에서 day 파라미터를 제거하고, 오늘의 점심 특선을 포함하는 파라미터를 추가해 보세요.
Swift 에서는 기본적으로 각 파라미터 이름을 인자 레이블로 사용합니다. 하지만 사용자 지정 레이블을 따로 작성하거나, _를 사용해 레이블을 생략할 수도 있습니다.
func greet(_ person: String, on day: String) -> String {
return "Hello \(person), today is \(day)."
}
greet("John", on: "Wednesday")
튜플(Tuple)을 사용하면 여러 값을 하나로 묶어 반환할 수 있습니다. 반환된 튜플의 요소는 이름 또는 숫자로 접근할 수 있습니다.
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
var min = scores[0]
var max = scores[0]
var sum = 0
for score in scores {
if score > max {
max = score
} else if score < min {
min = score
}
sum += score
}
return (min, max, sum)
}
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum) // 120
print(statistics.2) // 120
Swift 에서는 함수 내부에 또 다른 함수를 정의할 수 있습니다. 이때 내부 함수는 바깥 함수의 변수에 접근할 수 있어, 복잡한 로직을 정리하거나 구조화할 때 유용합니다.
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen() // 15
함수는 일급 객체(first-class citizen)이기 때문에, 다른 함수의 반환값으로 사용될 수 있습니다.
func makeIncrementer() -> ((Int) -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7) // 8
함수를 다른 함수의 인자로 넘길 수도 있습니다. 아래는 리스트에 조건을 만족하는 항목이 있는지 확인하는 함수입니다.
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
let numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen) // true
함수는 사실 클로저의 특별한 형태입니다. 클로저는 코드 블록으로, 나중에 실행할 수 있으며, 생성된 스코프의 변수나 함수에도 접근할 수 있습니다. 이는 앞서 본 중첩 함수 예제에서도 이미 확인할 수 있죠.
클로저는 이름 없이 중괄호 {}로 작성할 수 있으며, in 키워드로 파라미터와 반환 타입을 본문과 구분합니다.
numbers.map({ (number: Int) -> Int in
let result = 3 * number
return result
})
Experiment
위 클로저를 수정해, 홀수인 경우에는 0, 짝수는 원래대로 세 배로 반환하도록 변경해 보세요.
클로저의 타입이 이미 추론 가능한 상황에서는 파라미터 타입, 반환 타입을 생략할 수 있습니다. 하나의 표현식만 있는 경우에는 return도 생략 가능합니다.
let mappedNumbers = numbers.map { number in 3 * number }
print(mappedNumbers) // [60, 57, 21, 36]
짧은 클로저에서는 파라미터 이름을 생략하고 $0, $1처럼 인덱스로 접근할 수 있습니다. 또한, 클로저가 마지막 인자일 경우 괄호 바깥에 클로저를 작성할 수 있고, 클로저만 인자인 경우에는 괄호 자체도 생략할 수 있습니다.
let sortedNumbers = numbers.sorted { $0 > $1 }
print(sortedNumbers) // [20, 19, 12, 7]
⬅️ [A Swift Tour - Control Flow]
➡️ [A Swift Tour - Objects and Classes]
'Languages > Swift' 카테고리의 다른 글
A Swift Tour - Control Flow (1) | 2025.06.28 |
---|---|
A Swift Tour - Simple Values (0) | 2025.06.11 |
Version Compatibility (0) | 2025.05.09 |
About Swift (4) | 2025.05.06 |
Dev_Groo 님의 블로그 입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!