Swift 둘러보기 (A Swift Tour) - 함수와 클로저(Functions and Closures)

00yhsp·2024년 3월 21일

함수 선언 - func
소괄호 안에 인수 리스트와 함수 이름으로 호출한다.
함수 리턴 타입에서 파라미터 이름과 타입을 구분하기 위해 ->를 사용한다.

func greet(person: String, day: String) -> 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")

튜플을 사용하여 복합 값을 만든다.
튜플을 이용하여 함수가 여러 개의 값을 반환할 수 있고,
튜플의 element는 이름 또는 번호로 참조할 수 있다.

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)
// Prints "120"
print(statistics.2)
// Prints "120"

함수는 중첩될 수 있다.
중첩된 함수는 외부 함수에서 선언한 변수에 접근할 수 있으며,
중첩된 함수를 사용하여 길거나 복잡한 함수의 코드를 구성할 수 있다.

func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}
returnFifteen()

함수는 1급 타입(first-class type)이다.
이것은 함수가 다른 함수를 값으로 반환할 수 있다는 의미이다.

func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

함수는 다른 함수를 인수(argument) 중 하나로 가질 수 있다.

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
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)

함수는 나중에 호출될 수 있는 코드 블럭인 클로저(closure)의 특별한 케이스이다.
클로저에 있는 코드는 이미 중첩된 함수의 예제에서 보았듯이
클로저가 실행될 때 다른 범위에 있더라도
클로저가 생성된 범위에서 사용 가능한 변수, 함수와 같은 항목에 접근할 수 있다.
중괄호로 코드를 묶어 이름 없이 클로저를 작성할 수 있다.
본문으로부터 인수와 반환 타입을 분리하기 위해 in을 사용한다.

numbers.map({ (number: Int) -> Int in
    let result = 3 * number
    return result
})

더 간단하게 클로저를 작성하기 위한 몇 가지 방법이 있다.
delegate에 대한 콜백과 같이 클로저의 타입을 이미 알고 있다면
파라미터의 타입, 반환 타입 또는 둘 다 생략할 수 있다.
단일 클로저 구문은 암시적으로 구문의 값만 반환한다.

let mappedNumbers = number.map({ number in 3 * number })
print(mappedNumbers)
// prints "[60, 57, 21, 36]"

짧은 클로저에 유용한 방법으로 이름 대신 숫자로 파라미터를 참조할 수 있다.
함수의 마지막 인수로 전달된 클로저는 소괄호 바로 뒤에 나타날 수 있다.
클로저가 함수의 유일한 인수일 때 소괄호는 생략할 수 있다.

let sortedNumbers = numbers.sorted { $0 > $1 }
print(sortedNumbers)
prints("[20, 19, 12, 7]")
profile
iOS Dev

0개의 댓글