본문 바로가기
etc/Swift

클로저 고급

by IT learning 2021. 5. 26.
728x90

 

오늘은 클로저 고급 - 다양한 표현을 알아보았다.

 

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

후행 클로저 - 클로저가 함수의 마지막 전달인자라면, 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있다.

 

반환타입 생략

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

print(result) // 20

// 후행클로저와 함께 사용할 수도 있다
result = calculate(a: 10, b: 10) { (left: Int, right: Int) in
    return left + right
}

calculate 함수의 method 매개변수는 Int타입을 반환할 것이라는 걸 이미 함수에서 선언해줬고, 컴파일러 또한 알고 있기에 굳이 클로저에서 반환 타입을 명시해 주지 않아도 된다. 단, in 키워드는 생략할 수 없다. 후행 클로저와도 같이 사용이 가능하다!

 

단축인자 이름

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


print(result)

// 당연히 후행 클로저와 함께 사용이 가능합니다.

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

print(result) // 20

클로저의 매개변수 이름이 굳이 불필요하다면 단축 인자이름을 사용할 수도 있다. 단축 인자이름은 $0, $1,...으로 표현한다.

당연히 반환타입 생략처럼 후행 클로저와 같이 사용이 가능하다.

 

암시적 반환 표현

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

print(result) // 20

// 간결하게 한 줄로 표현해 줄 수도 있습니다
result = calculate(a: 10, b: 10) { $0 + $1 }

print(result) // 20

클로저가 반환하는 값이 있다면 클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급한다. 그러니까 리턴문을 쓰지 않아도 마지막 줄을 return을 해준다는 말이다. 따라서 위 코드와 같이 쓸 수가 있다. 또한 간결하게 한줄로도 가능하다!

 

축약하지 않은 것과 축약한 후의 문법 비교

// 축약하지 않은 클로저 문법과 축약 후의 문법 비교
result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
    return left + right
}

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

print(result) // 20

위의 코드가 축약하기 전 코드고 아래 코드가 제일 축약한 코드이다. 둘의 차이가 확연히 느껴지는가? 

이렇게 줄이는 것도 중요하지만, 실무에서 사용할 경우에는 같이 협업하는 개발자들도 쉽게 이해가 가능할 정도의 축약을 사용해야 한다. 그 점 유의 하고 사용하면 더욱 좋을 듯 싶다!

728x90

'etc > Swift' 카테고리의 다른 글

프로퍼티 감시자  (0) 2021.05.27
프로퍼티  (0) 2021.05.27
클로저  (0) 2021.05.24
클래스 vs 구조체 / 열거형  (0) 2021.05.24
열거형(enum)  (0) 2021.05.24

댓글

IT_learning's Commit