[Swift] closure

최승원·2022년 5월 16일
0

TIL (Today I Learned)

목록 보기
14/21

Closure란?

코드의 블럭으로, 변수나 상수 등으로 저장될 수 있다. (함수도 클로저의 일종이다.)
주로 함수의 전달 인자로서 사용된다.

클로저의 형태는 위와 같다.
in을 기준으로 클로저 헤드와 클로저 바디로 구분되는 것이 특징이다.

// 클로저
let add: (Int, Int) -> Int // 전달 인자 타입과 반환 타입
add = { (a: Int, b: Int) -> Int in
    return a + b
}

// 클로저
let substract: (Int, Int) -> Int // 전달 인자 타입과 반환 타입
substract = { (a: Int, b: Int) -> Int in
    return a - b
}

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var calculated: Int
calculated = calculate(a: 50, b: 10, method: add)
print(calculated) // 60

calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in return left*right})
print(calculated) // 500

후행 클로저 및 클로저의 축약형

클로저가 함수의 마지막 전달인자라면, 마지막 매개변수를 생략하고 소괄호 외부에 클로저를 구현할 수 있다.

// 반환 타입이 Int인 calculate 함수
// 마지막 parameter인 method가 클로저
// 함수의 기능: 마지막 인자인 method 클로저를 호출함
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var result: Int

// 위의 calculate 함수를 호출
result = calculate(a: 10, b: 10, method: {(left: Int, right: Int) -> Int in return left + right})

// 함수 마지막에 클로저를 꼬리처럼 덧붙여 쓸 수 있음 (Trailing Closure)
result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
    return left + right
}
print(result) // 20

// 클로저의 parameter 타입과 return 타입도 생략 가능
// 이미 caculate 함수에서 타입을 정의했기 때문
result = calculate(a: 10, b: 10) { (left, right) in
    return left + right
}

// 클로저의 매개변수 left와 right는 순서대로 $0과 $1로 생략 가능
// 후행 클로저 적용하지 않은 형태
result = calculate(a: 10, b: 10, method: {
    return $0 + $1
})

// 후행 클로저와도 같이 사용 가능
result = calculate(a: 10, b: 10) {
    return $0 + $1
})

// 단일 return문일 경우, return도 생략 가능
result = calculate(a: 10, b: 10) {
    $0 + $1
})

참고

Swift) 클로저(Closure) 정복하기(1/3) - 클로저, 누구냐 넌

profile
문의 사항은 메일로 부탁드립니다🙇‍♀️

0개의 댓글