dev._.note

[Swift] 클로저(Closure) 본문

Dev/SWIFT

[Swift] 클로저(Closure)

Laena 2023. 12. 10. 21:36

클로저 (Closure)

클로저는 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호"{}" 구분된 코드의 블럭. 쉽게 말하면 클로저는 이름이 없는 함수. 따라서 함수는 이름이 있는 클로저라고 할 수 있음. 클로저를 사용한다면 따로 함수를 만들어야 할 불편함 없이 즉석에서 함수를 만들 수 있음.

스위프트의 클로저와 같은 것들

  • C, C++, Objective-C 의 block
  • Java의 Lambda funtion
  • C#의 Delegates

클로저의 표현

{ (매개변수 이름 : 매개변수 타입) -> 반환타입 in 
	클로저 표현식 코드
}

함수와 굉장히 비슷한 형태를 띄고 있으며 가장 큰 차이점은 이름이 유무임. 클로저에서는 함수처럼 이름이 없음. 인자들을 넣을 수 있고 반환타입까지 설정가능. 그리고 함수의 내용에 해당하는 수행 내용을 in 다음에 작성. 

 

함수

func add(x:Int, y:Int) -> Int {
    return (x+y)
}

print(add(x:10, y:20))

두개의 인자를 받으며 두 인자의 합을 반환.

 

클로저

let add1 = {(x:Int, y:Int) -> Int in
    return(x+y)
}
print(add1(10,20))

위의 일반적인 함수와 기능은 똑같지만 클로저로 표현. add 상수에 함수를 넣어주는 느낌으로 표현.


후행 클로저 (trailing closure)

후행 클로저란 클로저가 함수의 마지막 argument라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있게 해주는 것임. 클로저에 여러 줄 표현(실행 코드)가 들어가게 된다면 가독성을 위해 사용하는 것이 좋음.

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

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

첫번째 코드는 후행 클로저를 사용하지 않은 코드. UIAlertAction에 인자가 3개가 있고 마지막 매개변수의 이름을 생략하고 후행 클로저를 사용가능.


클로저의 축약 표현들

배열을 정렬해주는 클로저.

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

let reversed = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})
print(reversed)
  • 타입 생략
    클로저는 메서드에서 요구하는 형태로 전달해야 함. 그래야 이러한 문맥을 이용해 타입을 유추할 수 있음. 그래서 매개변수의 타입이나 반환 타입을 생략해서 클로저를 사용할 수 있게 됨.
let reversed = names.sorted(by: { (s1, s2) in
    return s1 > s2
})
print(reversed)
  • return 생략
    클로저에서는 return도 생략가능.
let reversed = names.sorted(by: { (s1, s2) in
   	s1 > s2
})
print(reversed)
  • 매개변수 생략
    클로저에서는 매개변수의 이름도 생략가능. 매개변수의 이름을 명시하지 않아도 $와 숫자의 조합으로 단축 인자 이름을 사용할 수 있음. $0이 첫번째 매개변수가 되고 $2는 두번째 매개변수가 됩니다. 'in' 키워드도 생략가능.
let reversed = names.sorted(by: {
    return $0 > $1
})
print(reversed)
  • 연산자만 표기
    클로저는 매개변수의 타입과 반환 타입이 연산자를 구현한 함수의 모양과 동일하다면, 연산자만 표기하더라도 알아서 연산하고 반환.
let reversed = names.sorted(by: >)
print(reversed)

 

 

'Dev > SWIFT' 카테고리의 다른 글

[Swift] ARC(Automatic Reference Counting)  (0) 2023.12.12
[Swift] 예외처리  (0) 2023.12.11
[Swift] Guard문  (0) 2023.12.08
[Swift] 키오스크 과제  (1) 2023.12.07
[Swift] 접근 제한자  (0) 2023.12.06