본문 바로가기

Dev/iOS & SWIFT

[Swift] 클로저 (Closure) | 클로저와 함수 | 후행 클로저 | 반환타입 생략 | 단축 인자이름 | 암시적 반환 표현

728x90

클로저 (Closure)

  • 코드의 블럭
  • 1급 시민
  • 변수, 상수 등으로 저장, 전달인자로 전달이 가능
  • 함수: 이름이 있는 클로저
{ (매개변수 목록) -> 반환타입 in
	실행 코드
}

 

클로저 (Closure)의 기본적인 사용 예시

// 클로저를 상수로써 선언
let add: (Int, Int) -> Int
add = { (a: Int, b: Int) in
    return a + b
}

let substract: (Int, Int) -> Int
substract = { (a: Int, b: Int) in
    return a - b
}

let divide: (Int, Int) -> Int
divide = { (a: Int, b: 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: substract)
print(calculated) // 40

calculated = calculate(a: 50, b: 10, method: divide)
print(calculated) // 5

// 따로 클로저를 상수/변수에 넣어 전달하지 않고, 함수 호출 시에 작성할 수도 있음
calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in
    return left * right
})
print(calculated) // 500

 

다양한 클로저의 함축/생략 표현

  • 후행 클로저: 클로저가 함수의 마지막 전달인자라면, 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있음
result = calculate (a: 10, b: 10) { (left: Int, right: Int) -> Int in 
	return left + right
}
  • 반환타입 생략: 함수의 매개변수로서 클로저의 반환타입은 컴파일러도 알고 있기 때문에, 따로 명시해주지 않아도 괜찮음! (단, in 키워드는 꼭 써주어야 함)
result = calculate (a: 10, b: 10, method: { (left: Int, right: Int) in
	return left + right
})
  • 단축 인자이름: 클로저의 매개변수 이름이 굳이 불필요하다면 매개변수의 순서대로 $0, $1  ... 처럼 표현 가능
// 후행 클로저와 함께 사용한 예시
result = calculate(a: 10, b: 10) {
	return $0 + $1
}
  • 암시적 반환 표현:  클로저가 반환하는 값이 있다면, 클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급
// 후행 클로저와 함께 사용한 예시
result = calculate (a: 10, b: 10) {
	$0 + $1
}

 

이와 같은 다양한 축약 표현을 사용한다면 ?! 아주 간단하게 표현 가능 :)

// 축약 전
result = calculate (a: 10, b: 10, method { (left: Int, right: Int) -> Int in
	return left + right
})

// 축약 후
result = calculate (a: 10, b: 10) { $0 + $1 }

 

 

본 내용은 부스트코스의 'iOS 프로그래밍을 위한 스위프트 기초' 강의를 토대로 작성되었습니다

728x90