2018년 5월 1일 화요일

Result of call to ... is unused | Swift

언제 부터인지 기억나지는 않지만 스위프트(Swift)에서 값을 반환(return)하는 함수나 메소드 등을 그냥 호출하면, 즉 리턴값을 받지 않고 그냥 호출하는 코드에서는 아래와 같은 경고가 뜹니다.
Result of call to (Some Function or Method) is unused
메시지만 봐서는 별거 아닌 것일지도 모릅니다. 당연히 내용도 간단하고 해결법도 단순해 보입니다.


하지만 Xcode 상에서의 모든 경고가 그렇다시피, 위 스크린샷 처럼 노란 딱지가 붙어 있으면 상당히 걸리적 거립니다. 무슨 압류 딱지 마냥 눈길도 가고 놔두면 무슨 일이 생길 것 같기도 하고...

상황에 따라 반환값을 처리하지 않아도 될 때가 있습니다. 오히려 반환값을 받는 변수를 메모리에 할당하는게 아까운 수준이라고 생각해 보지요.

그럴때는 아래와 같이 공허의 변수[...]에 반환값을 받는 방법이 있습니다.
let _ = addition(a: 10, b: 20)
아마도 익숙한 방식일 것입니다. 대체로 값을 쓸 필요는 없지만 이터레이션 시켜야 하는 등 여러 상황에서 이 공허의 변수에 값을 대입하는 식으로 쓸 데 없는 변수를 받지 않는 방법이 있습니다.

하지만 이런 식의 코드는 개인적으로 선호하지 않습니다. let 이라는 키워드는 어쨌든 뭔가를 선언하는 용도인데 볼 수 없는 쓰레기통을 만드는 셈이니깐요. 아니 만들었음에도 주무를 수 없는 변수 아닌... 아니 이게 도데체 뭐란 말인가요 이런 설명 할 수 없는 기운에 휩싸입니다. 다크포스의 유혹이 느껴집니다...

물론 이 '공허의 변수' 라는 이름은 제가 멋대로 지은 것입니다. 적당하지 않나요? ;-)

@discardableResult

아마도 위의 '리턴 값을 처리하지 않는 당신을 괴롭히는 기능' 이 추가되었을 때 함께 추가되었을 법한 키워드를 알게 되었습니다. 바로 @discardableResult 입니다. 번역해 보면 결과(result)를 무시가능한(discardable) 이라는 의미인데 바로 이해가 될 것 같은 표현입니다.

위의 addition() 메소드를 살짝 고쳐봅시다.
@discardableResult
func addition(a: Int, b: Int) -> Int {
    return a + b
}
딱 한 줄 더 함수 선언 위에 추가한 모양세 입니다. 마치 파이썬(Python)의 데코레이터와 비슷한 문법 같습니다.

하여간 이 한 줄로 이제 귀찮음과 설명할 수 없는 불길한 다크포스의 유혹에서 해방 될 수 있습니다.


위 스크린샷에서 볼 수 있듯이 리턴값을 공허의 변수에 받지 않아도 아무런 경고문구가 보이지 않습니다.

정리해 보자면, Swift 에서는 무시 가능한 리턴값을 리턴하는 함수나 메소드는 그 설계 차원에서 이를 명시(discardableResult)해야 하며 그렇지 않으면 Xcode 가 당신을 괴롭히는 기능이 탑재되어 있습니다.

진작에 알았다면 제 공허의 변수가 쓰인 코드가 많이 줄었을 텐데 너무 아쉽습니다. 그래도 이제라도 알아서 다행일지도 모르겠네요.

물론 이런 경고 기능은 실수하지 말라고 Xcode 와 Swift Compiler 가 배려해 주는 것이니 굳이 탓하지는 맙시다. :D

[관련글] 스위프트(Swift) 가이드

댓글 없음 :