본문 바로가기
iOS/Swift

[iOS]클로저 Closure

by 안녕주 2021. 11. 7.

클로저란?

  • "코드블럭" 이라는 뜻을 가지고 있다.
  • 클로저는 일급 객체로 변수, 상수 등으로 저장, 전달인자로 저장이 가능한 형태다.
    1. 모든 일급 객체는 함수의 실질적인 매개변수가 될 수 있다.
    2. 모든 일급 객체는 함수의 반환값이 될 수 있다.
    3. 모든 일급 객체는 할당의 대상이 될 수 있다.
    4. 모든 일급 객체는 비교연산(==, equal)을 적용할 수 있다.
  • 우리가 여태 사용했던 함수들은 모드 "이름 있는 클로저" 형태

클로저 사용 형태

{ (매개변수 목록) -> 반환타입 in 실행 코드 }

 

함수(이름있는 클로저) 사용

func addFunction(a : Int, b : Int) -> Int { return a + b } var sumReault : Int = addFunction(a: 1,b: 2)

 

일반 클로저 사용

let add: (Int, Int) -> Int = { (a: Int, b: Int) in return a + b } let sumResult: Int = add(1,2)
  • (Int, Int) → Int 에서 Int형 두개를 받아서 Int 하나를 반환하는 형이야!(클로저식 타입 표현)
  • { (a: Int, b: Int) in return a + b } 에서 Int형 변수를 2개 받고, Int형을 반환하는 클로저다. 라는 것을 명시
  • "따로 상수/ 변수에 클로저를 저장하지 않고 이렇게 매개변수 자리에다가 클로저를 작성할 수 있다."

클로저를 다채롭게 표현할 수 있는 방법은 크게 4가지가 있다.

 

1. 후행 클로저

//원래의 클로저 방식 : method에 left,right 를 받아서 더한 값을 반환하는 클로저에 넣은 모습
result = calculate(a:10, b: 10, method: { (left : Int, right : Int) -> Int in
	return left + right
})

//후행 클로저 방식 : 마지막 method 전달 인자 이름을 생략해서 사용
return = calculate(a: 10, b: 10 { (left: Int, right: Int) -> Int in
	return left + right
}
  • 클로저가 함수의 마지막 전달인자라면, 마지막 매개변수 이름을 생략해서 함수 소괄호 외부에 클로저를 구현 할 수 있다.
  • 우리가 사용하던 dismiss 메소드의 경우를 보면 completion의 전달인자를 클로저로 사용함
    • (() → Void)?부분을 더블클릭하면 후행클로저를 작성할 수 있도록 편하게 코드 형태를 바꿔준다.

 

2. 반환타입 생략

//원래 클로저 작성
result = calculate(a:10, b: 10, method: { (left : Int, right : Int) -> Int in
	return left + right
})

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


//반환타입 생략
result = calculate(a:10, b: 10, method: { (left : Int, right : Int) in
	return left + right
})

result = calculate(a: 10, b: 10) { (left: Int, right: Int) in 
	return left + right
}​
  • 컴파일 상에서 어떤 타입을 반환할지 알고 있다묜 클로저에서는 반환타입을 명시해 주지 않아도 된다.

 

3. 단축 인자 이름

//원래 클로저 작성
result = calculate(a:10, b: 10, method: { (left : Int, right : Int) -> Int in
	return left + right
})

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


//단축 인자이름
result = calculate(a: 10, b: 10, method: {
	return $0 + $1
})

result = calculate(a:10, b:10) {
	return $0 + $1
}
  • 클로저 상에서 매개변수 이름이 불필요하다면, 단축 인자 이름을 활용할 수 있다.
  • 단축 인자 이름은 매개변수 순서대로 $0 $1 $2 ... 로 표현한다

 

4. 암시적 반환 표현

// 기존의 방식
result = calculate(a: 10, b: 10) {
	return $0 + $1
}

// 암시적 반환 표현 사용
result = calculate(a: 10,b: 10) {
	$0 + $1
}
  • 클로저가 반환하는 값이 있자면 마지막 줄의 결과값은 return을 적지 않아도 암시적으로 반환값으로 취급한다.

 

마지막으로

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

result = calculate(a: 10, b:10) {$0 + $1}
  • 위의 코드는 같은 결과값을 내는 클로버의 표현법이다.
  • 하지만 너무 축약을 하면 협업할 때 이해하기에 어려움이 있으니 어떤것을 사용할 건지 잘 합의를 봐야한다.

댓글