👩🏻💻 2020/12/16 ~ 스위프트 클로저에 대해 공부하기
☄️ Function -> Closure 로 변환하기
multiply function을 closure로 변환하려면
✅ func 키워드와 function 이름 삭제
✅ output 타입 뒤의 { curly braket 을 파라미터 앞으로 이동
✅ output 타입 뒤에 in 대입
func multiply(no1: Int, no2: Int) -> Int {
return no1 * no2
}
{ (no1: Int, no2: Int) -> Int in
return no1 * no2
}
// 한 줄로 정리하면,,
{ (no1: Int, no2: Int) -> Int in return no1 * no2 }
예시 >>>
아래 코드와 같은 두 개의 정수와 하나의 operation을 파라미터로 가지는 calculator라는 함수가 있다고 할 때
func calculator(n1: Int, n2: Int, operation: (Int, Int) -> Int) -> Int {
return operation(n1, n2)
}
func multiply(no1: Int, no2: Int) -> Int {
return no1 * no2
}
해당 함수를 사용하려면 아래와 같이 입력해줘야 한다.
operation(2, 3)을 반환하기 때문에 multiply 함수에서 2 * 3 으로 계산해 6을 반환한다.
calculator(n1: 2, n2: 3, operation: multiply) // 6
operation에 multiply 함수를 입력하는 것 대신 closure값을 넘겨주면 된다.
func calculator(n1: Int, n2: Int, operation: (Int, Int) -> Int) -> Int {
return operation(n1, n2)
}
calculator(n1: 2, n2: 3, operation: { (no1: Int, no2: Int) -> Int in return no1 * no2 })
이렇게 closure를 통해 코드의 길이를 단축시킬 수 있다.
☄️ Closure 축약하기
코드의 길이를 더 단축시킬 수 있는데 그 단계를 차례대로 살펴보자면,
<기본 closure 코드>
calculator(n1: 2, n2: 3, operation: { (no1: Int, no2: Int) -> Int in return no1 * no2 })
<파라미터의 데이터 타입 지우기>
calculator(n1: 2, n2: 3, operation: { (no1, no2) -> Int in return no1 * no2 })
스위프트는 값을 보고 데이터 타입을 추론할 수 있기 때문에 operation의 파라미터들의 데이터 타입을 지워줄 수 있다.
n1과 n2의 데이터 타입은 정수로 이 input값을 closure에 넣어주면 컴파일러는 operation의 데이터 타입 또한 정수라는 것을 쉽게 추론할 수 있다.
<반환값의 데이터 타입 지우기>
calculator(n1: 2, n2: 3, operation: { (no1, no2) in return no1 * no2 })
n1 * n2를 반환한다는 것을 (정수 * 정수 = 정수) 통해 반환값의 데이터 타입도 추론할 수 있다.
<return 키워드 지우기>
calculator(n1: 2, n2: 3, operation: { (no1, no2) in no1 * no2 })
컴파일러는 closure의 프로레싱을 파악하고 있기 때문에 return 키워드를 지워줘도 잘 작동한다.
<파라미터 이름 변환하기>
calculator(n1: 2, n2: 3, operation: {$0 * $1})
closure는 익명으로 된 파라미터의 이름을 제공하기 때문에 no1, no2의 이름을 대체할 수 있다.
스위프트에서는 $0가 첫 번째 파라미터를 나타내고, $1이 두 번째 파라미터를 나타낸다. ($2 = 세 번째...)
<trailing closure = 후행 클로저>
calculator(n1: 2, n2: 3) {$0 * $1}
스위프트에서 마지막 파라미터가 closure이면, 마지막 파라미터의 이름을 생략하고 input 값들 뒤에 closure를 붙여줄 수 있다.
이렇게 코드의 길이를 단축시켜도 값은 6으로 동일하다.
☄️ Closure를 사용하면 코드의 길이를 아주 간결하게 줄일 수 있다.
그러나, 코드를 이렇게 축약시키면 가독성이 떨어져 협업할 때 다른 개발자가 나의 코드를 보고 헷갈릴 수 있다.
가독성과 간결함 사이에서 적당한 선을 지킬 것!!
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] Object Library란? (그리고 하나하나 오브젝트에 대해) (0) | 2021.01.30 |
---|---|
[iOS] info.plist란? (그리고 하나하나 속성 정리) (0) | 2021.01.30 |
[iOS] Project editor란? (0) | 2021.01.30 |
[Swift] Optional 옵셔널이란? (0) | 2020.12.08 |
[iOS] - 소수점 x자리 아래로 자르는 방법 (1) | 2020.12.04 |