본문 바로가기
⌨️ Language/swift

[Swift] 클로저 (Closure)

by hyebin (Helia) 2023. 2. 6.

클로저 (Closure)

  • 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호"{}" 구분된 코드의 블록
  • 이름이 없는 함수
  • 클로저는 어떠한 상수나 변수의 참조를 캡처(capture)해서 저장 가능
  • Swift는 이 캡처와 관련한 모든 메모리를 알아서 처리
  • 파라미터를 받을 수 있고, 반환 값이 존재할 수 있다는 점에서 함수와 동일
  • Swift 클로저는 최적화를 통해 깔끔하고 명확한 스타일을 가지고 있음
    • 문맥(context)에서 인자 타입과 반환 타입의 추론 
    • 단일 표현식 클로저의 암시적 반환 
    • 축약된 인자 이름 
    • 후위 클로저 문법
{ (매개변수 이름 : 매개변수 타입) -> 반환타입 in 
	클로저 표현식 코드
}

 

후행 클로저 (trailing closure) 

  • 클로저가 함수의 마지막 argument라면, 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있게 해주는 것
//후행 클로저 미사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default, handler: {
    //실행 코드
})

//후행 클로저 사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default) {
    //실행 코드
})

 

클로저 축약 표현

  • 타입 생략
    • 클로저는 메서드에서 요구하는 형태로 전달해야 함
    • 그래서 스위프트에서는 이러한 문맥을 이용해 타입을 유추할 수 있음
    • 그래서 매개변수의 타입이나 반환 타입을 생략해서 클로저를 사용 가능
  • return 생략
  • 매개변수 생략
    • 매개변수의 이름을 명시하지 않아도 $와 숫자의 조합으로 단축 인자 이름을 사용 가능
    • $0이 첫 번째 매개변수가 되고 $1는 두 번째 매개변수
    • 'in' 키워드도 생략
  • 연산자만 표기
    • 클로저는 매개변수의 타입과 반환 타입이 연산자를 구현한 함수의 모양과 동일하다면, 연산자만 표기하더라도 알아서 연산하고 반환
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

let reversed = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

//타입 생략
let reversed = names.sorted(by: { (s1, s2) in
    return s1 > s2
})

//return 생략
let reversed = names.sorted(by: { (s1, s2) in
   	s1 > s2
})

//매개변수 생략
let reversed = names.sorted(by: {
    return $0 > $1
})

//연산자만 표기
let reversed = names.sorted(by: >)

 

반응형

'⌨️ Language > swift' 카테고리의 다른 글

[Swift] 에러 처리  (0) 2023.02.07
[Swift] 고차함수  (0) 2023.02.06
[Swift] 익스텐션 (Extensions)  (0) 2023.02.06
[Swift] 프로토콜 (Protocol)  (0) 2023.02.06
[Swift] assert와 guard  (0) 2023.02.06

댓글