본문 바로가기

Swift

Swift - Closure(클로저)

Swift Closure:
- 클로저는 익명함수이며, 함수와 마찬가지로 First-class Citizen임.  

- 자바에서는 람다, 오브젝티브-C에서는 블럭이라고 명칭.

- self-contained code blocks

Named Closures: (Global Function, Nested Function) 함수는 이름이 있는 클로저.

Unnamed Closures: ( Anonymous Function) 익명함수 

* 중요: 코드블럭은 호출하기 전까지 실행이 안됨. 

생성 문법:

{ (parameters) -> returntype in
   statements 

아래와 같이 c 상수에 할당해 주면 클로저에 이름이 c가 됨. 

let c = { 

     print(“hello”)

}

 

클로저 헤드는 클로저 바디와 in 키워드로 구분. 

함수와 마찬가지로 매개변수와 리턴형이 생략될 수 있으며, 아래가 가장 간단한 closure 형식이 될 수 있음. 

{ statements } 

 

{ print(“Hello, Swift”) } // error  주의: 클로저는 글로벌 스코프에서 단독으로 작성할 수 없음. 

상수(변수)에 저장하여 사용하는 것은 괜찮음.

let c = { print(“Hello, Swift”) } 

parameter와 return형이 생략된 클로저. () -> ()

 

함수를 전달하는 곳에 클로저를 전달할 수 있으며, 반대의 경우도 가능.

 

클로저는 이름이 없는 함수인데 c라는 이름을 부쳐줌. 그래서 호출시에는 c()라고 하면 됨.

 

c()  // hello swift가 출력됨. 

 

클로저의 자료형과 함수 자료형과 동일하며, 함수와 호환이 됨.

함수 전달하는 곳에 클로저 전달할 수 있으며 반대 경우도 가능함. 

 

클로저의 파라미터와 리턴형 추가  타입: (String) -> String 

let c2 = { (str: String) -> String in 

return “Hello, \(str)”

 

let result = c2(“Closure”)

print(result)

 

중요: 위에 호출문에서도 볼 수 있듯이, Closure에서는 argument label을 사용하지 않음.

그래서 클로저를 호출시에는 아규먼트레이블을 사용하지 않고 바로 아규먼트를 씀. 

 

Inline Closure: 아규먼트로 클로저를 바로 전달되는 경우. 구문이 단순한 경우 사용. 

 

typeAlias 

 

case 1: closure를 파라미터로 전달 

typeAlias로 선언 (가독성 위해) 

typeAlias SimpleStringClosure = (String) -> String 

 

func perform(closure: SimpleStringClosure) { 

print(closure(“iOS”)) 

 

perform(closure: c2) 

 

iOS를 C2에 파라미터로 전달. 

 

perform(closure: { (str: String) -> String in 

return “Hi, \(str)”

})

 

'Swift' 카테고리의 다른 글

Swift - Optional(옵셔널)  (0) 2020.03.20
Swift - First Class Citizen  (0) 2020.03.19
Swift - Function(함수)  (2) 2020.03.19
Swift - Collection(배열,딕셔너리, 셋)  (0) 2020.03.17
Swift - 변수와 상수(Constant and Variables in Swift)  (0) 2020.03.16