정의
- 코드의 블록입니다.
- 참조 타입입니다.
- 일급 객체(시민)입니다.
1, 일급 객체는 전달 인자로 보낼 수 있습니다.
2, 일급 객체는 변수, 상수, 등으로 저장하거나 전달 할 수 있습니다.
3, 일급 객체는 함수의 반환 값이 될 수 있습니다.
- 함수 또한 클로저의 포함됩니다. ( 함수 = 이름 있는 클로저 )
형식
- 매개변수가 없는 경우 ( ) 로 생략 가능
- 반환타입이 없으면 void로 생략 가능
{ (매개변수 목록) -> 반환타입 in
// 실행할 코드
}
예제
1, 함수
- 다음은 일반적인 함수입니다.
- Sum 이라는 함수에 매개변수 a, b에 대한 값을 계산해주는 기능입니다.
- SumResult라는 변수에 a=1, b=2 값을 입력한 Sum 함수를 초기화하고 실행해보겠습니다.
func Sum(a: Int, b: Int) -> Int{
return a + b
}
var SumResult: Int = Sum(a: 1, b: 2)
print(SumResult)
실행결과
// 3
2, 함수의 클로저 사용
- Sum 함수를 클로저로 표현한 형식입니다.
- 위의 예제와 동일한 기능을 수행하지만, 클로저를 사용해 코드의 작성 형식이 다른 것을 확인할 수 있습니다.
var Sum: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
return a + b
}
var SumResult = Sum(1, 2)
print(SumResult)
실행결과
// 3
3, 함수를 할당한 클로저
- 함수는 클로저의 일종이므로 Sum 변수에 SumFuntion 함수를 할당할 수 있습니다.
- Sum이라는 변수에 SumFuntion 함수를 할당했습니다.
- 그리고 SumResultV라는 변수에 Sum 변수를 값을 지정해 호출하면 SumFuntion 함수에 내장된 코드를 수행합니다.
- 실행을 통해 함수와 클로저와 동일하게 수행됨을 확인할 수 있습니다.
func SumFuntion(a: Int, b: Int) -> Int{
return a + b
}
var SumResult: Int = SumFuntion(a: 1, b: 2)
print(SumResult)
var Sum: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
return a + b
}
var SumResultA = Sum(1, 2)
print(SumResultA)
Sum = SumFuntion(a:b:)
var SumResultV = Sum(1, 2)
print(SumResultV)
실행결과
// 3
// 3
// 3
4, 함수의 전달인자로서의 클로저
- 클로저는 함수의 전달인자로 많이 사용됩니다.
- 다음 예제를 보면 각 계산에 따른 클로저를 생성한 뒤, 함수를 사용하며 메서드로 클로저를 호출합니다.
- 함수를 실행할 때 method 뒤에 클로저를 호출하여 클로저에 작성된 코드기능을 구현할 수 있습니다.
let add: (Int, Int) -> Int
add = { (a: Int, b: Int) -> Int in
return a + b
}
let substract: (Int, Int) -> Int
substract = { (a: Int, b: Int) -> Int in
return a - b
}
let divide: (Int, Int) -> Int
divide = { (a: Int, b: Int) -> Int in
return a / b
}
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
var calculated: Int
calculated = calculate(a: 50, b: 10, method: add)
print(calculated) // 60
calculated = calculate(a: 50, b: 10, method: substract)
print(calculated) // 40
calculated = calculate(a: 50, b: 10, method: divide)
print(calculated) // 5
5, 함수의 전달인자로서의 클로저 2
- 위의 예제와 동일한 예제입니다.
- 메서드라는 매개변수의 전달 인자에 바로 코드 블록을 작성해도 위와 동일하게 기능을 구현할 수 있습니다.
let add: (Int, Int) -> Int
add = { (a: Int, b: Int) -> Int in
return a + b
}
let substract: (Int, Int) -> Int
substract = { (a: Int, b: Int) -> Int in
return a - b
}
let divide: (Int, Int) -> Int
divide = { (a: Int, b: Int) -> Int in
return a / b
}
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
var calculated: Int
calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in
return left * right
})
print(calculated) // 500
내용 출처
https://www.youtube.com/watch?v=Ix9gGuupjBU&list=PLz8NH7YHUj_ZmlgcSETF51Z9GSSU6Uioy&index=17
'iOS > Swift 문법 심화 학습' 카테고리의 다른 글
구조체 [ Struct ] (0) | 2022.02.03 |
---|---|
클로저 고급 (0) | 2022.02.02 |
값 타입과 참조 타입 (0) | 2022.01.31 |
extensions (0) | 2022.01.30 |
guard (0) | 2022.01.28 |
댓글