조앤의 기술블로그
[Swift] 클로저 (Closure) 본문
클로저란, 짧고 독립적인 코드 조각(Self-contained code blocks)을 의미합니다.
(자바에서는 람다라는 개념이 있습니다. )
이름이 없는 함수라고 이해할 수도 있습니다.
그리고 함수와 클로저는 서로 호환됩니다.
기본 syntax를 보겠습니다.
//#1.
{ (parameters) -> Return Type in
Statements
}
//#2.
{ Statements }
[예제 1]
let a = { print("Hello, Swift") }
//a()
여기서 a()를 호출하게되면 에러가 납니다.
클로저는 글로벌 scope에서는 단독으로 사용이 불가하기 때문입니다.
[예제 2]
let b = { (str: String) -> String in
return "Hello \(str)"
}
클로저에서는 argument label을 사용하지 않습니다. 따라서 에러가 납니다.
고치고 올바른 예제를 보면,
let b2 = { (String) -> String in
return "Hello, \(String)")
}
let str = b2("Closure")
print(str)
이렇게 됩니다.
[예제 3]
클로저를 파라미터로 전달할 수도 있습니다.
let b2 = { (String) -> String in
return "Hello, \(str)"
}
typealias StringToString = (String) -> String
func perform(closure: StringToString) {
print(closure("iOS"))
}
perform(closure: b2) //Hello, iOS 출력
상수에 저장되어 있는 argument가 전달되어 'Hello, iOS'가 출력됩니다.
[예제 4]
Inline Closure에 대해서 알아보겠습니다.
위의 예제에서 perform함수를 변경해보겠습니다.
perform(closure: { (str: String) -> String in
return "Hi, \(str)"
})
함수의 Body가 짧으면 주로 이렇게 작성하고, Inline Closure라고 부릅니다.
Swift의 Framework의 검색, 정렬 API들은 Inline Closure을 파라미터로 많이 사용합니다.
[예제 5]
let BTS = [
"Kim NamJun", "Kim SeokJin", "Min YoonGi",
"Jeong HoSeok", "Park JiMin", "Kim TaeHyung", "Jeon JungKook"
]
var kimBrothers = BTS.filter({ (name: String) -> Bool in
return name.contains("Kim")
})
print(kimBrothers)
["Kim NamJum", "Kim SeokJin", "Kim TaeHyung"]이 출력됩니다.
(사실 이 문법은 단축 문법으로 교체할 수 있고, 단축 문법으로 더 많이 사용됩니다. 단축 문법에 관한 내용은 Sytax Optimization 포스팅에서 다루겠습니다. )
감사합니다.
참고: KxCoding.com (https://www.youtube.com/channel/UCtVacbJccQlQL_FP5XSEQMQ)
'Study > Swift' 카테고리의 다른 글
[Swift] guard Statement (guard문) (0) | 2020.02.16 |
---|---|
[Swift] Structures and Classes (구조체와 클래스) (0) | 2020.02.16 |
[Swift] 옵셔널 체이닝 (Optional Chaining) (0) | 2020.02.15 |
[Swift] 옵셔널 바인딩 (Optional Binding) (1) | 2020.02.14 |
[Swift] 옵셔널 (Optional) (0) | 2020.02.13 |