The Swift Programming Language 도서 내용을 토대로 번역 및 요약된 내용입니다.
func
통해 함수를 선언할 수 있다.
괄호 및 파라미터들과 함수의 반환 type 값은 ->
키워드로 구별된다.
func greet(person: String, day: String) -> String { // 함수 greet 생성, 반환 type: String
return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")
일반적으로 매개변수명
은 파라미터명
을 따르나, 파라미터명 앞에 따로 명시
할 수 있다.
또한 _
키워드를 매개변수명으로 사용하여 생략
하여 사용할 수 있다.
func greet(_ person: String, on day: String) -> String { // 파라미터명 앞에 매개변수명 명시
return "Hello \(person), today is \(day)." // 함수 내에선 파라미터명 사용
}
greet("John", on: "Wednesday") // 함수 사용시엔 매개변수명 사용
tuple
type을 통해 multiple value 값을 지닌 타입을 만들어 함수에서 여러 값들을 반환시 사용할 수 있다.
tuple 의 요소
들은 숫자
또는 이름
을 통해 접근할 수 있다.
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) { // 반환갑: tuple
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) // tuple 을 통해 여러변수값들 반환
}
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum) // 이름을 통해 요소 접근
// Prints "120"
print(statistics.2) // 숫자를 통해 요소 접근
// Prints "120"
함수는 특정함수 내 함수로써 nested function
이 될 수 있으며, outer 함수의 변수들을 접근
할 수 있다.
func returnFifteen() -> Int {
var y = 10
func add() { // nested function, outer function 의 변수인 y 접근 가능
y += 5
}
add()
return y
}
returnFifteen()
함수는 first-class type
이므로 반환값
이 될 수 있다.
또한 매개변수
로 사용될 수 있다.
func makeIncrementer() -> ((Int) -> Int) { // 반환타입: func
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne // func 반환
}
var increment = makeIncrementer()
increment(7)
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { // condition: 함수
for item in list {
if condition(item) { // 함수 내에서 매개변수로 받은 함수를 사용
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen) // 함수의 매개변수로 함수 사용
함수는 실제로 closure 의 특별케이스
로, 나중에 호출할 수 있는 blocks of code 이다.
closure의 코드는 closure가 실행될 때 다른 범위에 있더라도 closure가 생성된 범위에서 사용할 수 있었던 변수와 함수와 같은 것에 접근할 수 있다. (ex: nested function)
또한 함수명 없이 ({})
형식을 통해 이름없는 closure
를 작성할 수 있다.
in
키워드를 통해 함수의 함수의 반환 type
과 분리된다.
numbers.map({ (number: Int) -> Int in // param, return type 명시된 closure
let result = 3 * number
return result
})
closure 를 보다 간결하게 사용할 수 있습니다.
closure 의 parameter
들, 또는 return type
또는 둘다 type 을 이미 알고있다면 생략
할 수 있다.
let mappedNumbers = numbers.map({ number in 3 * number }) // param: Int, return: Int 알 수 있으므로 둘다 생략된 closure
print(mappedNumbers)
// Prints "[60, 57, 21, 36]"
또한 parameter
들을 이름 대신 $숫자
형식으로 사용할 수 있다.
let mappedNumbers = numbers.map({ 3 * $0 }) // $0을 통해 parameter 명 생략된 closure
print(mappedNumbers)
// Prints "[60, 57, 21, 36]"
함수에 대한 마지막 매개변수
로 전달된 클로저는 괄호 바로 뒤에 나타날 수 있습니다.
let mappedNumbers = numbers.map() { number in 3 * number }
print(mappedNumbers)
// Prints "[60, 57, 21, 36]"
closure 가 함수의 유일한 매개변수
일 때, 괄호를 완전히 생략할 수 있습니다.
let sortedNumbers = numbers.sorted { $0 > $1 } // 유일한 매개변수이기에 괄호 생략된 closure
print(sortedNumbers)
// Prints "[20, 19, 12, 7]"
다음에서 발췌
docs.swift.org
The Swift Programming Language (Swift 5.5) Apple Inc.
이 자료는 저작권에 의해 보호됩니다.