# @Escaping 클로저란??

Brad·2022년 7월 13일
0

@Escaping 클로저란??

→ @escaping 속성은 인자값으로 전달된 클로저를 저장해 두었다가, 나중에 다른 곳에서도 실행할 수 있도록 허용해주는 속성

인자값으로 전달되는 클로저의 특성

스위프트에서는 함수의 인자값으로 전달된 클로저는 기본적으로 탈출불가(non-escape)의 성격을 가짐

  1. 함수 내에서
  2. 직접 실행을 위해서만 사용

→ 이 떄문에 함수 내부라 할지라도 변수나 상수에 대입 불가

만약 변수나 상수에 대입하는 것을 허용한다면 내부 함수를 통한 캡처(Capture)기능을 이용하여 클로저가 함수 바깥으로 탈출할 수 있기 때문

여기서 탈출이란??
함수 내부 범위를 벗어나서 실행되는 것을 의미

@escaping 속성을 추가하게 되면 위의 제약 조건들이 모두 제거됨

이 속성은 인자값에 설정되는 값이므로 함수 타입 앞에 넣어주어야 함

func callback(fn: @escaping () -> Void) {
	let f = fn
  fn()
}

callback {
	print("Ok")
}

Q. 그럼 Swift는 왜 클로저의 기본 속성이 탈출불가(non-escaping)으로 설정된 이유가 멀까???

가장 큰 이점: 컴파일러가 코드를 최적화하는 과정에서의 성능 향상 → 해당 클로저가 탈출할 수 없다는 것은 컴파일러가 더 이상 메모리 관리상의 지저분한 일들에 관여할 필요없다는 뜻이기 떄문

또한 탈출불가 클로저 내에서는 self 키워드를 사용할 수 있습니다. 왜냐하면 이 클로저는 해당 함수가 끝나서 리턴되기 전 호출될 것이기 떄문에.. 따라서 self 에 대한 약한 참조(weak reference)를 사용해야할 필요가 없슴.

그래서 클로저의 캡쳐 기능이란??

“값을 잡아둔다” ?? … OK

A closure can capture constants and variables from the surrounding context in which it’s defined. The closure can then refer to and modify the values of those constants and variables from within its body, even if the original scope that defined the constants and variables no longer exists. - 공식문서 -

→ 클로저는 상수나 변수를 캡쳐할 수 있다.. 그리고 그 값을 참조하거나 변경할 수 있음 → 해당 코드 블럭 내에서만 기본 값은 (non-escaping) 이기에

ex) 공식문서 예제

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
  var runningTotal = 0
  func incrementer() -> Int {
    runningTotal += amount
    return runningTotal
  }
  return incrementer
}
let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen() //returns a value of 10
incrementByTen() //returns a value of 20

capturing Values

→ 값을 잡아두고 있기 때문.. 그러면 왜, 어떻게 잡아 둘까?? → 참조하고 있는 대상이 있기 떄문. 참조가 없으면 해제

클로저는 참조타입!! → 값을 공유

profile
iOS 개발자가 되고 싶은 브래드 입니다.

0개의 댓글