비교적 짧고 독립적인 코드 조각
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에서 캡처한 변수를 바꾼다면 원본 변수 값도 변함
'FE 공부 > Swift' 카테고리의 다른 글
Swift_Structure & Class (0) | 2022.10.10 |
---|---|
Swift _ Collection (2) | 2022.10.04 |
Swift _ Tuples, Strings and Characters (0) | 2022.10.04 |
Swift _ Functions (0) | 2022.10.03 |
Swift _ Optional (0) | 2022.10.03 |
댓글