Toy Project/Swift Language Syntax

7. Swift Closure 조금더

개발자킹콩 2021. 1. 21. 16:38

// Closure 보강!!!!

// 함수는 어떤 기능을 수행하는 코드블록이며, 
// Swift에서는 함수와 같이 기능을 수행하는 코드블록의 특별한 타입인 Closure가 존재한다. 사실 Closure가 더 상위 개념이다


// Swift 공식사이트에서 정의한 Closure:
// Closure는 크게 3가지 타입이 존재한다.

// Global functions are closures that have a name and don’t capture any values.
// Nested functions are closures that have a name and can capture values from their enclosing function.
// Closure expressions are unnamed closures written in a lightweight syntax that can capture values from their surrounding context.

// 1. Global함수 : 전역함수
// 2. Nested함수 : 함수안에 함수를 정의하는 함수
// 3. Closure Expressions : 우리가 배울 것!! 이름이 없고 주변의 값들을 캡쳐할수있는 가벼운 문법인 Closure type이다. 실제 우리가 통상적으로 Closure라고 하는 것이다.


// function과 closure는 인자받기, 값리턴, 변수로 할당이 가능, First Class Type이다.
// function은 이름이 있고 func 키워드를 사용한다. Closure는 이름없고, 키워드없다.


// First Class Type 은 어떤 type을 말하는 것일까??
// 변수에 할당할 수 있다. 인자로 받을 수 있다. 리턴할 수 있다.


// Closure는 실무에서 어떻게 쓸모가 있는가?
// 실무에서는 다음의 형태로 자주 쓰인다.

// 1. Completion Block: 어떤 task가 완료 되었을 때 수행되는 Closure이다.
// 앱에서 네트워크를 통해 데이터를 받아오면 네트워크 환경에 따라 빠를수도 느릴수도 있다. 비동기적으로 언제 끝나는지 모르는 task의 경우 완료 시 장치를 두게 되는데 이때 Closure를 수행하도록 설정한다. 

// 2. Higher Order Functions: input으로 함수를 받을 수 있는 유형의 함수를 고귀함수(Higher Order Functions)라고 한다. 이렇게 input으로 넣어주는 함수의 경우 GlobalFunction으로 넘겨줄수도 있지만, Closure를 자주 사용하게 된다.





// 실습
// { (parameters) -> return type in
//   statements
// }

// Example 1: Cho Simple Closure
let choSimpleClosure = {

}
choSimpleClosure() //Closure 실행문


// Example 2: 코드블록을 구현한 Closure
let SimpleClosure = {
  print("Hello, 클로져 하이")
}
SimpleClosure()


// Example 3: 인풋 파라미터를 받는 Closure
let Closure_3: (String) -> Void = { str in 
  print(str)
}
Closure_3("3번예제 안녕")


// Example 4: 값을 리턴하는 Closure
let Closure_4: (String) -> String = { str in 
  let message = "4번예제 안녕, \(str)님"
  return message
}
print(Closure_4("사아아번"))

// Example 5: Closure를 파라미터로 받는 함수 구현
func someSimpleFunction(choSimpleClosure: () -> Void) {
  print("5번예제")
  choSimpleClosure()
}
someSimpleFunction(choSimpleClosure: {
  print("안녕코로나야")
})


// Example 6: Trailing Closure
func someSimpleFunction(message:String, choSimpleClosure: () -> Void) {
  print("6번예제, 메세지는: \(message)")
  choSimpleClosure()
}
// someSimpleFunction(message: "로나로나메로나", choSimpleClosure: {
//   print("안녕코로나야")
// })

// 여기서 더욱 많은 인자를 받게 되면 코드의 직관성, 가독성이 떨어져 헷갈린다.
// 그래서 Swift에서는 제일 마지막인자가 Closure인 경우 특이한 생략이 가능하다.
someSimpleFunction(message: "로나로나메로나") {
  print("안녕코로나야")
}

'Toy Project > Swift Language Syntax' 카테고리의 다른 글

9. Swift Structure practice  (0) 2021.01.21
8. Swift Structure  (0) 2021.01.21
6. Swift Closure basic  (0) 2021.01.21
5. Swift Collection(Dicionary, Set)  (0) 2021.01.21
4. Swift Collection (Array)  (0) 2021.01.21