[Swift] 클로저에 대한 이해

팔랑이·2024년 7월 23일
0

iOS/Swift

목록 보기
53/71
post-thumbnail

클로저 기본 개념 정리

클로저는 코드 블럭이다.

  • 기본형() -> () 또는 () -> Void로 표현하며, 이는 입력값과 출력값이 없는 클로저를 의미한다.

다음과 같이 여러 경우의 입력값과 출력값을 가질 수도 있다.

  • 예시 1: 입력 형식이 String이고 출력 형식이 Int 인 클로저
  let lengthClosure: (String) -> Int = { (text: String) in
      return text.count
  }
  
  let length = lengthClosure("Hello, Swift!")
  print(length) // 출력: 13
  • 예시 2: Timer.scheduledTimer에서 block 파라미터를 사용한 클로저
    • 이 메서드는 입력 형식이 Timer, 출력 형식이 없는 클로저를 인자로 받는다.
  Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
      self.updateUI()
  }
  • 예시 3: 여러 개의 인자를 받는 클로저
    • 입력값 두 개(Int, Int)를 받아 더한 결과(Int)를 반환
  let addClosure: (Int, Int) -> Int = { (a: Int, b: Int) in
      return a + b
  }
  
  let result = addClosure(3, 5)
  print(result) // 출력: 8

여러 개의 클로저 인자를 사용하는 방법

한 메서드 안에서 2개 이상의 클로저를 인자로 받아야 하는 경우에는 다음과 같은 방식으로 작성할 수 있다.

1. 인라인 클로저로 직접 전달

  • 모든 클로저를 메서드 호출부에 직접 작성하는 방식으로, 간결하지만 여러 개의 클로저가 필요할 경우 코드가 길어질 수 있다.
      A(a: {
          print("첫 번째 작업 실행")
      }, b: {
          print("두 번째 작업 실행")
      })

2. 변수에 클로저를 저장 후 전달

  • 각 클로저를 변수에 저장해두고, 메서드에 인자로 전달하는 방식이다. 가독성을 높이거나 재사용이 필요한 경우 유용하다.
      let firstTask = {
          print("첫 번째 작업 실행")
      }
      
      let secondTask = {
          print("두 번째 작업 실행")
      }
      
      A(a: firstTask, b: secondTask)

3. 후행 클로저 구문 사용

  • 후행 클로저는 메서드의 마지막 매개변수가 클로저일 때, 그 클로저를 메서드 호출 괄호 밖에 작성할 수 있는 Swift 문법이다. 두 개의 클로저 중 하나만 후행 클로저로 사용할 수 있기 때문에, 첫 번째 클로저는 인라인으로 두고 마지막 클로저만 후행으로 작성할 수 있다.
      A(a: {
          print("첫 번째 작업 실행")
      }) {
          print("두 번째 작업 실행")
      }

추가 개념: 클로저의 캡처 기능

  • 클로저는 코드 블록이 생성될 당시의 외부 변수나 상수의 값을 함께 캡처하여 저장할 수 있다.
      var count = 0
      let increment = {
          count += 1
      }
      
      increment()
      print(count) // 출력: 1
profile
정체되지 않는 성장

0개의 댓글