Closures입니다. closer 아닙니다!! ㅎㅋㅋ
참조 타입인 클로저란 코드의 블럭을 뜻합니다.
자세히 설명하자면, 코드안에서 전달되어 사용할 수 있는 로직을
가진 코드의 코드의 블럭이며 {}로 구분됩니다.
일급 시민 취급이라 전달인자 및 변수, 상수들으로 저장, 전달이 가능합니다.
함수는 클로저의 일종으로 이름이 있는 클로저라고 생각하면 된다고 합니다.
- 전역 함수 : 이름이 있고 어떤 값도 캡쳐하지 않는 클로저
- 중첩 함수 : 이름이 있고 관련한 함수로 부터 값을 캡쳐 할 수 있는 클로저
- 클로저 표현 : 경량화 된 문법으로 쓰여지고 관련된 문맥(context)으로부터 값을 캡쳐할 수 있는 이름이 없는 클로저
Swift에서 클로저는 다음과 같은 내용을 포함해 최적화되어 있습니다.
- 문맥(context)에서 인자 타입(parameter type)과 반환 타입(return type)의 추론
- 단일 표현 클로저에서의 암시적 반환
- 축약된 인자 이름
- 후위 클로저 문법
기본 형태
{
(매개변수 목록) -> 반환타입 in
실행 코드
}
예제
sum 이라는 함수에 클로저를 할당하는 예제입니다.
let sum : (Int, Int) -> Int {
(a: Int, b: Int) in
return a + b
}
let result: Int = sum(3, 9)
print(result) // 12
함수의 전달인자로써의 사용
클로저는 함수의 전달인자로 많이 사용됩니다.
내부에서 원하는 코드블럭을 실행할 수 있습니다.
클로저를 함수의 전달인자로 사용해 사칙연한을 하는 예제입니다.
let add: (Int, Int) -> Int
add = { (a: Int, b: Int) in
return a + b
}
let sub: (Int, Int) -> Int
sub = { (a: Int, b: Int) in
return a - b
}
let div: (Int, Int) -> Int
div = { (a: Int, b: Int) in
return a / b
}
let mul: (Int, Int) -> Int
mul = { (a: Int, b: Int) in
return a * b
}
func calculate (a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
return method(a, b)
}
var calc: Int
calc = calculate (a: 8, b: 4, method: add)
print(calc) //12
calc = calculate (a: 8, b: 4, method: sub)
print(calc) //4
calc = calculate (a: 8, b: 4, method: div)
print(calc) //2
calc = calculate (a: 8, b: 4, method: mul)
print(calc) //32
//함수 호출시 클로저로 상수/변수 전달하기
var clac_add = calculate (a: 8, b: 4, method: { (num1: Int, num2: Int) -> Int in
return (num1 + num2)
})
print(clac_add) //12
다양한 클로저 표현들
클로저 매개변수를 갖는 함수와 결과값을 저장할 변수를 먼저 선언하겠습니다.
func calc(a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
return method(a, b)
}
var result: Int
후행 클로저
클로저가 함수의 마지막 전달인자라면, 마지막 매개변수 이름을 생략하고
함수 소괄호 외부에 클로저를 위치시킬 수 있습니다.
/*
기존에 사용했던 함수
var clac_add = calculate (a: 8, b: 4, method: { (num1: Int, num2: Int) -> Int in
return (num1 + num2)
})
*/
result = calc(a:4, b:5) { (num1: Int, num2: Int) -> Int in
result num1 + num2
}
print(result) //9
반환타입 생략
calc의 반환값이 Int임이 명시되어 있으므로, 반환타입은 생략가능 합니다.
result = calc(a: 4, b: 5, method: { (num1: Int, num2: Int) in
result num1 + num2
})
// 후행클로저
result = calculate(a: 4, b: 5) { (num1: Int, num2: Int) in
return num1+ num2
}
print(result) //9
이름 인자 축약
클로저의 매개변수 이름을 필요하다면 단축 인자이름을 활용할 수 있습니다.
단축 인자이름은 언급된 매개변수의 순서대로 $0, $1, $2, $3...로 표현됩니다.
result = calc(a:4, b:5, method:{
return $0 + $1
})
//후행 클로저에 적용
result = calc(a:4, b:5) {
return $0 + $1
}
print(result) //9
암시적 반환
클로저의 반환값이 있다면, 클로저 마지막 줄의 결과는 암시적으로 반환값으로 취급합니다.
result = calc(a:4, b:5, method:{ $0 + $1 })
//후행 클로저에 적용
result = calc(a:4, b:5) { $0 + $1 }
함수로 구현
func add(_ num1: Int, _ num2: Int)-> Int{
return num1 + num2
}
var result = add(3,4)
print(result) //7
클로저로 구현
func add(a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
return method(a, b)
}
var result: Int
//축약 전의 클로저
result = add(a: 3, b: 4, method: { (num1: Int, num2: Int) -> Int in
return num1 + num2
})
print(result) //7
//축약 후의 클로저
result = add(a: 3, b: 4) { $0 + $1 }
print(result) //7
공부하는데 도움을 준 사이트
전반적인 공부 가이드라인
공식 스위프트 언어 가이드 번역 사이트
jusung.gitbook.io/the-swift-language-guide/language-guide/07-closures
클로저 추가 참고
seorenn.blogspot.com/2014/06/swift-closures.html
클로저 추가 참고2
medium.com/@jgj455/%EC%98%A4%EB%8A%98%EC%9D%98-swift-%EC%83%81%EC%8B%9D-closure-aa401f76b7ce
'Language > Swift' 카테고리의 다른 글
Swift 인스턴스의 생성과 소멸 (0) | 2021.03.12 |
---|---|
Swift 프로퍼티 타입들 (0) | 2021.03.12 |
Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리] (0) | 2021.03.11 |
Swift 사용자 정의 타입 - enum (0) | 2021.03.11 |
Swift 사용자 정의 타입 - Class (0) | 2021.03.11 |