클로저는 이름이 없는 익명 함수이다. 클로저와 함수의 기능은 완전히 동일한데, 형태만 다르다고 생각하면 된다. 함수는 이름이 있는 코드 묶음이고 클로저는 이름이 없는 코드 묶음이다. 함수는 다른 코드가 함수 이름으로 호출하고 클로저는 굳이 이름이 없어도 호출할 수 있는 형태로 사용이 가능하다.
함수에서 클로저로 변화시키기
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
// 하고싶은 일을 함수 실행시 정의가 가능하다.
}
클로저를 파라미터로 받는 함수를 정의
파라미터로 전달하는 클로저가 기존 함수 내용이 다 실행되고나서 실행된다고 봐도 무방하다.
함수를 실행할 때 파라미터를 클로저 형태로 전달
개발자가 향후, 원하는대로 정의할 수 있기 때문에 활용도가 늘어난다.
performClosure(closure: { str in
return str.count
})
performClosure { $0.count }
클로저의 실행이 본래 함수를 벗어나서도 실행하도록 하는 키워드
내부 클로저를 외부 변수에 저장할 때 주로 사용한다.
@escaping 키워드가 필요 없는 경우
func performEscaping1(closure: () -> ()) {
closure()
}
performEscaping1 {
print("실행")
}
@escaping 키워드가 필요한 경우
Heap 영역에 저장해서 사용해야함 → 더 오래 유지할 필요가 있을 때
func perform Escaping2(closure: () -> ()) {
aSavedFunction = closure
}
closure function을 변수에 저장하는 경우
함수의 실행을 벗어나서도 사용 → 메모리 관리 필요
** 이거 먼말인지 모르겠음 ,,, 정리 함 해봐야할듯
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
}