본문 바로가기
iOS/Swift 문법 심화 학습

클로저 고급

by 황민우 2022. 2. 2.

지난 클로저에 이은 클로저에 다양한 사용법에 대해 알아보겠습니다.

 

[클로저의 기본 개념]

2022.02.01 - [iOS/Swift 문법 심화 학습] - 클로저

 

클로저

정의 - 코드의 블록입니다. - 참조 타입입니다. - 일급 객체(시민)입니다. 1, 일급 객체는 전달 인자로 보낼 수 있습니다. 2, 일급 객체는 변수, 상수, 등으로 저장하거나 전달 할 수 있습니다. 3, 일

seagreen83.tistory.com

 


예제

- 먼저 클로저를 사용하기 위한 함수를 만들겠습니다.

- 메소드라는 이름으로 클로저를 전달 받아 기능을 구현하는 함수입니다.

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

 

 

후행 클로저

후행 클로저 정의

 = 후행 클로저는 클로저가 함수의 마지막 전달인자라면, 마지막 매개변수 이름을 생략하고

    함수 소괄호 외부에 클로저를 구현할 수 있습니다.

- 일반 클로저와 다르게 calculate 함수 뒤에 method가 없이, 괄호 뒤에 바로 클로저가 사용되었습니다.

- 이렇게 method가 생략된 것을 보아, 이 클로저는 함수의 마지막 전달인자란걸 알 수 있습니다.

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var result: Int

result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
    return left + right
}

print(result)

실행결과
// 20

 

반환타입 생략

반환타입 생략

= calculate함수의 method 매개변수는 Int 타입을 반환할 것이라는 것을 컴파일러도 알고 있습니다.

   때문에 클로저에 반환타입을 명시하지 않아도 기능을 구현할 수 있습니다. ( 단, in 키워드는 생략 불가 )

- calculate 함수에 매개변수의 자료형 타입이 명시되어있기 때문에 클로저 내에서 반환타입을 생략했습니다.

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var result: Int

result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) in
    return left + right
})

print(result)

실행결과
// 20

- 다음과 같이 후행 클로저와도 함께 사용할 수 있습니다.

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var result: Int

result = calculate(a: 10, b: 10) { (left: Int, right: Int) in
    return left + right
}
print(result) 

실행결과
// 20

 

단축 인자이름

단축 인자이름

= 클로저의 매개변수 이름이 굳이 필요하지 않다면, 단축 인자이름을 사용할 수 있습니다.

   단축 인자이름은 클로저의 매개변수 순서대로 $0, $1, $2, $3.. 과 같이 표현합니다.

- 위의 예제에서 사용되었던 left, right라는 매개변수의 이름이 없어도 기능 구현이 가능합니다.

- 반환타입 또한 생략 가능합니다.

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var result: Int

result = calculate(a: 10, b: 10, method: {
    return $0 + $1
})

print(result) 

실행결과
// 20

- 다음과 같이 후행 클로저와 함께 사용할 수 있습니다. 

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var result: Int

result = calculate(a: 10, b: 10) {
    return $0 + $1
}

print(result) 

실행결과
// 20

 

암시적 반환 표현

암시적 반환 표현

= 클로저가 반환하는 값이 있다면 return 키워드를 사용하지 않아도,

   클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급합니다.

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var result: Int

result = calculate(a: 10, b: 10) {
    $0 + $1
}

print(result) 

실행결과
// 20

- 코드가 길지 않다면 다음과 같이 한 줄로 표현할 수도 있습니다.

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var result: Int

result = calculate(a: 10, b: 10) { $0 + $1 }

print(result) 

실행결과
// 20

 

※ 클로저를 축약하여 사용할 때 주의사항

 = 클로저를 너무 축약한다면 다른사람이 코드를 이해할 수 없기 때문에 적당하게 축약사용을 해야합니다.


내용출처

https://www.youtube.com/watch?v=WvqYKP6VgNQ&list=PLz8NH7YHUj_ZmlgcSETF51Z9GSSU6Uioy&index=18 

 

'iOS > Swift 문법 심화 학습' 카테고리의 다른 글

클래스 [ Class ]  (0) 2022.02.03
구조체 [ Struct ]  (0) 2022.02.03
클로저  (0) 2022.02.01
값 타입과 참조 타입  (0) 2022.01.31
extensions  (0) 2022.01.30

댓글