[Swift] Closure 간단 정리

yxxjxn·2023년 7월 11일

클로저는 이름이 없는 익명 함수이다. 클로저와 함수의 기능은 완전히 동일한데, 형태만 다르다고 생각하면 된다. 함수는 이름이 있는 코드 묶음이고 클로저는 이름이 없는 코드 묶음이다. 함수는 다른 코드가 함수 이름으로 호출하고 클로저는 굳이 이름이 없어도 호출할 수 있는 형태로 사용이 가능하다.

함수와 클로저의 형태

함수에서 클로저로 변화시키기

func add(a: Int, b: Int) -> Int {
	let result = a + b
	return result
}

// closure는 이름이 없다.
(a: Int, b: Int) -> Int {
	let result = a + b
	return result
}

// 매개변수 형태 주목
{ (a, b) in
	let result = a + b
	return result
}

클로저의 형태

{ (파라미터) -> 리턴형 in
	let result = a + b
	return result
}

{ (파라미터) in
	let result = a + b
	return result
}

클로저를 사용하는 이유

func closureCaseFunction(a: Int, b: Int, closure: (Int) -> Void) {
	let c = a + b
	closure(c)
}

closureCaseFunction(a: 5, b: 2, closure: { (number) in
	// 하고싶은 일을 함수 실행시 정의가 가능하다.
}
  1. 클로저를 파라미터로 받는 함수를 정의

    파라미터로 전달하는 클로저가 기존 함수 내용이 다 실행되고나서 실행된다고 봐도 무방하다.

  2. 함수를 실행할 때 파라미터를 클로저 형태로 전달

    개발자가 향후, 원하는대로 정의할 수 있기 때문에 활용도가 늘어난다.

클로저의 문법 최적화

performClosure(closure: { str in
	return str.count
})

performClosure { $0.count }

@escaping 키워드

클로저의 실행이 본래 함수를 벗어나서도 실행하도록 하는 키워드

내부 클로저를 외부 변수에 저장할 때 주로 사용한다.

  • @escaping 키워드가 필요 없는 경우

    func performEscaping1(closure: () -> ()) {
    	closure()
    }
    
    performEscaping1 {
    	print("실행")
    }
    • 함수 내부에서 단순하게 실행하고 종료할 때 클로저를 heap 영역에 저장할 필요가 없다.
  • @escaping 키워드가 필요한 경우

    • Heap 영역에 저장해서 사용해야함 → 더 오래 유지할 필요가 있을 때

      func perform Escaping2(closure: () -> ()) {
      	aSavedFunction = closure
      }
    • closure function을 변수에 저장하는 경우

    • 함수의 실행을 벗어나서도 사용 → 메모리 관리 필요

@autoclosure 키워드

** 이거 먼말인지 모르겠음 ,,, 정리 함 해봐야할듯

실제 클로저의 사용 예시

let emailTextField: UITextField = {
	let tf = UITextField()
	tf.placeholder = "Email"
	tf.backgroundColor = UIColor( ... )
	tf.borderStyle = .roundedRect
	tf.font = UIFont.systemFont(ofSize: 14)
	tf.addTarget(self, action:..., for:...)
	return tf
}
profile
macos

0개의 댓글