티스토리 뷰

프로그래밍/iOS

[SWIFT]클로저

KYU 2018. 10. 24. 00:00
반응형

클로저에 대해서 공부한 내용을 요약 정리 했습니다.


클로저란 무엇일까? 클로저는 함수를 객체로 사용하는 것을 클로저(Closer)라고 합니다.


클로저?

  • 클로저는 함수 객체를 말합니다.
  • 클로저의 형태는 함수나 코드 블록을 포함합니다.
  • 클로저가 정의된 콘텍스트까지 포함합니다.


1. 함수 타입

1
2
3
4
5
6
7
//함수 정의
func sayHI(){
    print("Hi")
}
//함수참조
let hi = sayHI()
hi



함수 객체를 참조 변수로 사용할 때의 타입을 말합니다. 함수타입은 파라미터로도 사용할 할 수 있습니다. 

정리하자면, 함수 타입은 함수의 구성 요소의 파라미터, 반환 타입으로 구성됩니다.


1
2
3
4
5
6
7
8
// 함수타입 (Int, Int) -> Int
func add(i: Int, j: Int-> Int{
    return i + j
}
 
// 함수타입 () -> ()
// 함수타입 () -> Void 변경 
func SayHi(){ ... }




2.  클로저 사용

func sorted(by order: (Element, Element) -> Bool) -> [Element]


Array.sorted() 함수는 파라미터로 클로저를 사용하고 있습니다. sorted() 함수를 사용하기 위해서는 파라미터로 표시된 함수 타입 생성하여 넣어주면 사용할 수 있습니다. 

(Element로 보이는 것은 제네릭 타입이라서 타입이 정확히 표현이 안 된 것입니다.)

 


3.  클로저 표현식 단축

1) 타입 선언 생략 가능합니다.

2) 1줄 return 인 경우 -> return 생략 가능합니다.

3) 반환 타입 선언 생략 가능합니다.

4) 파라미터 선언 생략 가능합니다.


4.  클로저 축약

1) 클로저 파라미터가 마지막인 경우 괄호 밖에 작성이 가능합니다.

2) 외부 파라미터 사용 생략도 가능하여 코드를  더 간략하게 표현이 가능합니다.

    만약 클로저의 파라미터가 1개 일 시 괄호식도 생략 가능합니다.


5.  클로저 사용 API

클로저를 사용하는 API 작성하려면 클로저의 함수의 타입 결정하여야 합니다.

- 반환 값으로 사용

- 파라미터로 사용

- 프로퍼티에 사용

반환값, 파라미터, 프로퍼티에서 클로저 사용하는 방식은 동일하게 구현할 수 있습니다.


6.  클로저 캡처

만약 클로저에서 선언된 부분에서 프로퍼티(property)를 사용 시 그 값을 캡쳐해서 가져오게 됩니다. 클로저는 정의되면서 그때 사용한 값을 캡쳐해서 사용하게 됩니다.


7.  escaping, noescaping

함수 파리미터로 클로저가 전달 될 때 사용합니다..

7.1. noescaping

- 함수의 범위에 벋어나지 못하게 하는 방식입니다.

- 스위프트3 에서는 기본 설정으로 구성되었습니다.

- 클로저에서 다른 프로퍼티로 대입 시도 시 error 가 발생합니다.

- 다른 함수 파라미터로 호출은 가능합니다. 

  그 이유는 다른 함수 파라미터에 들어간다는 것은 함수 범위에 못 벋어났기 때문입니다.

7.2. escaping

- 파라미터 타입에 @escaping 작성 시 파라미터 클로저를 함수 외부에서 사용이 가능합니다. 

- noescaping 에서 escaping 함수 파라미터 대입은 불가능 합니다. 



8. autoclosure

- 파라미터가 없는 표현식을 클로저로 변환하는 것을 말합니다.

    자동으로 클로저로 변환하여 {} 없이 사용이 가능합니다.

- autoclosure는 모두 noescape으로 되어있습니다. 만약 함수 범위 벋어나고 싶을 때는 escaping 선언하면됩니다.


반응형

'프로그래밍 > iOS' 카테고리의 다른 글

[SWIFT] 메일 보내는 방법 알아보자  (0) 2018.12.21
내부 배포용 앱 만들기(Enterprise)  (0) 2018.12.02
iOS 인앱 평가 추가하기  (0) 2018.08.22
FCM Notification 구현해보자  (0) 2018.08.20
iPhone X UI 대응 사례  (0) 2018.08.16
댓글