조앤의 기술블로그

[Swift] 클로저 (Closure) 본문

Study/Swift

[Swift] 클로저 (Closure)

쬬앤 2020. 2. 16. 12:42

클로저란, 짧고 독립적인 코드 조각(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)