2024. 4. 18. 16:56ㆍSwift, iOS Foundation
예전 @IBInspectable @IBDesignable 글에서 Swift에서 사용하는 @ 키워드는 컴파일러에게 추가적인 속성이 부여되었음을 알리는 역할이라고 설명한 적이 있었다.
즉, 코드에 메타 데이터 (special attribute와 directive)를 추가하는 역할을 하는 키워드라고 생각하면 된다.
이번 글에서는 @키워드를 사용한 @discardableResult에 대해 설명해보고자 한다.
1. @descardableResult 기본 개념
descardable = 버릴 수 있는, result = 결과
즉, "결과를 버릴 수 있도록 하는 속성"을 추가로 부여한다는 키워드가 @descardableResult이다.
이 키워드가 함수에서 사용되는 키워드라는 점에서 볼 때,
함수에서 해당하는 결과는 "반환값"이라고 볼 수 있고, 버릴 수 있다는 것은 "사용하지 않아도 괜찮다"라는 것을 의미한다고 볼 수 있다.
결국 종합해볼 때 @descardable은 함수의 반환값을 사용하지 않아도 괜찮게 만들어주는 키워드라고 이해하면 되겠다.
2. @descardableResult는 어떻게 사용하는데?
굳이 왜 함수의 반환값을 무시해도 좋다는 것을 키워드까지 입력하면서 지정해줘야 하는 이유가 뭘까?
실제 코드에서 상황을 예시로 들어보겠다.
함수의 구현 내용은 중요하지 않으니 반환 타입만 확인해봤을 때, 아래 함수는 Bool 타입을 return 하도록 되어있다.
그런데 만약 함수의 사용 부분에서 반환되는 Bool 값을 별도로 사용하거나 프로퍼티에 저장하는 것이 아니라,
단순히 함수 호출만 하게 될 경우에는 "Result of call to '함수이름()' is unused"라는 Warning이 표출되는 것을 확인할 수 있었다.
즉, "함수로부터 반환되는 Result가 쓰이지 않고 있습니다" "너 무언가 잘못한거 아님?!"이라고 경고를 보여주는 것.
이런 경우, 아래와 같이 해당 함수에 @discardableResult 키워드를 붙이면,
위에서처럼 함수의 결과값을 사용하지 않더라도 같은 Warning이 발생하지 않는 (= 반환값을 사용하지 않아도 괜찮은) 상황이 만들어진다!
아니 함수에 결과를 반환시키도록 만들었으면서 그 "반환된 값을 사용하지 않는 경우가 있어?"라고 말할 수 있지만,
아래와 같이 어떤 경우에는 반환값을 상수에 저장해서 사용해야 할 수도, 어떤 경우에는 그저 print만 시켜야 하는 경우 (= 반환값을 사용하지 않아도 되는 경우)가 있을 수도 있다.
연산과 두 수를 받아 print를 시키거나 반환값을 받는 두 가지 케이스를 살펴보고 필요성에 공감하길 바란다.
@discardableResult
func calculateAndLog(_ operation: String, _ a: Int, _ b: Int) -> Int {
let result: Int
switch operation {
case "add": result = a + b
case "subtract": result = a - b
default: return 0
}
print("연산을 수행한 값은: \(result)입니다.")
return result
}
// 1) 결과값을 변수에 저장해서 사용하는 경우
let sum = calculateAndLog("add", 5, 3)
// 2) 결과값을 무시하고 함수 호출 자체가 목적인 경우
calculateAndLog("subtract", 5, 3)
'Swift, iOS Foundation' 카테고리의 다른 글
[Swift] 제네릭 (Generic) 완전 정복하기 (0) | 2024.07.03 |
---|---|
[Swift] 프로퍼티 래퍼 (Property Wrapper)를 공부해보자 (0) | 2024.07.02 |
[Swift] for-in문과 forEach 사이의 차이, 그리고 고차함수(map, filter, reduce)의 활용까지 (0) | 2024.03.11 |
[Swift] Swift는 에러를 어떻게 처리할까? (Error Handling) (1) | 2024.02.13 |
[iOS] 내가 서버 통신(Networking) 진짜 알기 쉽게 정리해서 올려줄게 (HTTP, JSON, REST API) (2) | 2023.11.13 |