개발하는 동글 :]

[TIL],[Swift],[Closure정리하기] 본문

카테고리 없음

[TIL],[Swift],[Closure정리하기]

동글하다 2023. 8. 15. 21:28

1. Closure?

Unnamed Closure와 Named Closure를 둘 다 포함

1.1 Named Closure, Unnamed Closure

  • Named Closure : 평소와 같이 선언해 왔던 함수
func doSomething() {
    print("Somaker")
}
  • Unnamed Closure : 이름을 붙이지 않고 사용하는 함수
let closure = { print("Somaker") }

 

1.2 스위프트는 함수를 일급객체로 취급한다. 

  • 일급객체로 취급한다면?
    • 함수를 변수에 할당할 수 있음
    • 함수를 호출할 때 함수를 파라미터로 전달할 수 있음
    • 함수에서 함수를 반환할 수 있음
  •  

 

2. Closure의 형태

{(Parameters) -> (Return Type) in
	실행구문
    return (Return Type)
}

{(Parameters) in
	실행구문
    return (Return Type)
}
  • 예시 코드
var aType = {(a:Int, b:Int) -> Int in
    return a + b
}

var bType = {(a:Int, b:Int) in
    return a + b
}

aType(1,2) //Argument Label 없음
bType(1,2) //Argument Label 없음
  • 클로저에서는 Argument Label을 사용하지 않는다. 따라서 a, b는 오직 Parameter Name이다

2.1 Trailing Closure(후행 클로저)

func doSomething(closure: () -> ()) {
    closure()
}

이러한 Closure를 파라미터로 받는 함수가 있다고 가정해 보자.

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

기존의 표현식을 사용한 함수 호출은 이런 식으로 표현해야 했다.

이처럼 클로저가 파라미터의 값 형식으로 함수 호출 구문 안에 작성되어 있는 것을 Inline Closure라고 부른다.

하지만 이 경우 가독성이 좋지 않다.

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

하지만 이런식으로 Trailing Closure 방식을 사용한다면 함수의 가장 마지막에 클로저를 꼬리처럼 덧붙여서 쓸 수 있다.

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

여기서 파라미터가 클로저 하나일 경우에는 호출구문인 ()도 생략할 수 있다.

2.2 파라미터가 여러 개인 함수

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

이러한 파라미터가 여러 개인 함수의 실행을 Inline Closure와 Trailing Closure로 비교해 보자.

  • Inline Closure의 경우
fetchData(success: { () -> () in
    print("Success!")
}, fail: { () -> () in
    print("Fail!")
})
  • Trailing Closure의 경우 마지막 파라미터의 클로저는 함수 뒤에 붙여 쓸 수 있다.
fetchData(success:  { () -> () in
    print("Success!")
}) { () -> () in
    print("Fail!")
}

파라미터가 하나가 아니기 때문에 호출구문은 생략이 불가능하다.

 

- 추후 클로저 단축 문법 정리하기

 

Reference

https://babbab2.tistory.com/82

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/