post-custom-banner

참고1

참고2

참고3

Closure는 뭐지?

“Closures are self-contained blocks of functionality that can be passed around and used in your code.” — apple

Closure는 Apple 공식 문서에서 나와있는 것처럼, 특정 기능이 self-contained blocks으로 구성된 코드의 묶음이라고 보면 된다. 즉, 우리가 알고 있는 Function과 같은 의미이다. 정확히는 우리가 알고 있는 Function은 Named Closure이고, 여기서 말하는 closureUnnamed Closure이다.!

Syntax of Closure

{ (parameter:parameter type) -> return type in
	statements
}

Unnamed Closure의 의미처럼, func를 사용하지 않는다. 그리고, parameterreturn type을 결정하는 Head와 statements를 포함하는 Body로 구성되어 있다. 이때, in으로 Head와 Body를 구분한다.

let theClosure = {
	print("JUST LOVE CLOSURE")
}
theClosure()

위의 예시처럼, Closure는 1급 객체이므로, (1) 상수(let)나 변수(var)에 대입, (2) 함수의 파라미터 타입으로의 전달, (3) 함수의 반환 타입으로의 사용이 가능하다. --> 1급 객체에 대한 자세한 설명

let theClosure : (String) -> (String) = { name in 
	let love = "love" + "closure"
    return love
 }
 theClosure("LOVE CLOSURE")

Trailing Closure

Closure를 경량 문법으로 사용하는 것을 뜻한다.

함수의 마지막 파라미터가 클로저일 때,이를 파라미터 값 형식이 아닌 함수 뒤에 붙여 작성하는 문법
이때, Argument Label은 생략된다

파라미터가 클로저 하나인 함수

// 정의
func doSomething(closure: () -> ()) {
    closure()
}

// 호출
doSomething(closure: { () -> () in
    print("Hello!")
})

Trailing Closure 적용 전은 위에 처럼 작성해야 했다. 나처럼 눈이 안 좋은 사람은 Syntax에러 나기 딱 좋은 상황일 것 같다.. 이렇게 Closure가 파라미터의 값 형식으로 함수 호출 구문 ()안에 작성되어 있는 것을 inline Clousre라고 한다.

이것을 Trailing Closure 방식으로 바꾸게 되면.. 두 단계로 경량화 할 수 있다.


doSomething () { () -> () in
    print("Hello!")
}

doSomething { () -> () in
    print("Hello!")
}
 // 더 헷갈리는 것 같기도(?)...

파라미터가 여러 개인 함수

이것을,


func fetchData(success: () -> (), fail: () -> ()) {
    //do something...
}

fetchData(success: { () -> () in
    print("Success!")
}, fail: { () -> () in
    print("Fail!")
})

요렇게~

fetchData(success:  { () -> () in
    print("Success!")
}) { () -> () in
    print("Fail!")
}
profile
RTFM
post-custom-banner

0개의 댓글