FE 공부/Swift

Swift _ Closures

꼬질꼬질두부 2022. 10. 4. 00:29
비교적 짧고 독립적인 코드 조각

 

Function
전역 함수
&
Nested Function
중첩 함수

: Named Closure
(그냥 함수라고 부름)
Anonymous Function
:Unnamed Closures
(클로저라고 부름)

공통점

first class citizen

  • 변수와 상수에 저장할 수 있음
  • parameter로 전달할 수 있음
  • 함수와 메소드에서 리턴할 수 있음

>>  서로 호환 가능

 

Unnamed Closure의 특징

  • argument label 사용 X
  • 보다 간결하고 유연함 _ 컴파일러 추론이 가능하기때문에 생략하는 것

 

{ (parameters) -> ReturnType(Closure Head) in(in 키워드 _ Head 부분과 Body 부분 분리)
	statements(Closure Body)
}//함수와 달리 func 키워드가 없고 모든 요소가 {}안에 포함됨
//예제
let c2 = {(str: String) -> String in
	return "Hello, \(str)"
} //Closure는 global scope 내에서 단독으로 사용 불가
let result = c2("Closure") // argument label 사용 안 함
print(result) //Hello, Closure


{statements} //parameter와 return형 생략 가능. 생략 시 in 키워드도 함께 생략
//예제        
let c2 = {print("Hello, Swift") }
c2() //Hello, Swift

 


 

클로저 코드 단축을 위한 문법 최적화 규칙

 

products.filter({ (name: String) -> Bool in
	return name.contain("Pro")
})

1. parameter형과 return형을 생략한다.

products.filter({ (name) in
	return name.contain("Pro")
})​

 

 

2. parameter형과 in 키워드를 삭제하고 Shorthand Argument Name으로 대체한다.

products.filter({
	return $0.contain("Pro")
})​

 

 

3. closure에 포함된 코드가 단일 표현이라면 return을 생략한다. _ Implicit Returns

products.filter({
	$0.contain("Pro")
})

 

 

4. closure가 마지막 parameter라면 Trailing Closure로 작성한다.

products.filter(){
	$0.contain("Pro")
}​

 

5. 괄호 사이에 parameter가 더이상 없다면 괄호를 생략한다.

products.filter{
	$0.contain("Pro")
}​

 


 

Capturing Values

 

global Function

           - 값을 캡처하지 않음

Nested Function

          - 자신을 포함하고 있는 함수 바디에 있는 값에 접근할 때, 이 값을 캡처함

Anonymous Function

          - 클로저 외부에 있는 값에 접근할 때 값을 캡처함

 

//closure가 내부에서 외부에 있는 값에 접근 할 때 외부 값을 캡처함(원본 값을 가지고 와서 씀)
var num = 0
let c = {print("check point #1: \(num)")} // closure가 capture한 값
c() // check point #1: 0

num += 1
print("check point #2: \(num)") // check point #2: 1
//closure에서 캡처한 변수를 바꾼다면 원본 변수 값도 변함