본문 바로가기
TIL(Today I Learned)

2024. 06. 17 Today I Learned

by 승환파크 2024. 6. 18.

클로저

스위프트에서 클로저란 보통 익명 함수를 뜻한다. 하지만 사실 func 키워드를 사용해 이름을 붙이는 함수들도 모두 클로저에 속한다.

클로저에는 Named Closure 와 Unnamed Closure 이 두가지로 나뉘는데 func 키워드를 사용해 만드는 함수를 named Closure 이라고 한다.

 

클로저 표현식

클로저 표현식은 아래와 같다.

{ (매개변수) -> 리턴 타입 in 
	실행구문
}

 

 

클로저는 말 그대로 익명'함수' 이기 때문에 매개변수와 리턴 타입이 존재할 수 있다. 

매개변수와 리턴 타입이 모두 존재하지 않는 클로저

let closure = { () -> () in
	print("Closure")
}

 

매개변수와 리턴 타입이 모두 존재하는 클로저

let closure = { (name: String) -> String in 
	return "Hello, \(name)"
}

 

여기서 주의할 점은 매개변수에 name 은 parameter Name 이지만, Argument Label 은 아니다. 따라서 클로저를 호출하려면 아래의 코드처럼 호출을 해야한다.

closure("홍길동")

closure(name: "홍길동") // <- Error

 

무조건 Argument Label을 사용하지 않는다. 만약 사용하면 오류가 발생한다.

 

1급 객체로서 클로저

클로저도 함수이므로 1급 객체 함수의 특성을 그대로 다 가지고 있다.

 

1. 클로저를 변수나 상수에 대입할 수 있다.

클로저 또한 변수나 상수에 대입할 수 있고, 이 대입된 변수나 상수로 실행이 가능하다.

let closure = { () -> () in 
	print("Closure")
}

 

위 코드와 같이 대입과 동시에 클로저를 작성할 수 있고, 다른 방법으로는 이미 만들어진 클로저를 변수나 상수에 대입할 수 있다는 점이다.

let closure2 = closure

 

2. 함수의 파라미터 타입으로 클로저를 전달할 수 있다.

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

 

이 코드처럼 함수를 매개변수로 받는 함수가 있을 때 매개변수를 함수로 줄 수 있지만, 미리 만들어둔 클로저를 매개변수로 사용할 수 있고, 클로저를 직접 작성해서 넘겨줄 수도 있다.

function1(closure: { () -> () in
	print("Hello")
})

 

3. 함수의 반환 타입으로 클로저를 사용할 수 있다.

func function2() -> () -> () {
}

 

이런 방식으로 함수의 반환 타입을 만들어 두고 함수를 반환할 수 도 있지만, 아래의 코드처럼 직접 return 값에 클로저를 작성해서 반환해줄 수 있다.

func function2() -> () -> () {
	return { () -> () in
    		print("Hello")
	}
}

'TIL(Today I Learned)' 카테고리의 다른 글

2024.06.24 Today I Learned  (1) 2024.06.24
2024.06.19 Today I Learned  (0) 2024.06.19
2024.06.11 Today I Learned  (1) 2024.06.11
2024.06.10 Today I Learned  (0) 2024.06.10
2024.06.05 Today I Learned  (0) 2024.06.05