Swift | @discardableResult (feat. Swift가 허락한 괴짜적 사고)
코드를 작성하다보면 괴짜적 사고를 할 때가 있습니다
수많은 괴짜적 사고 중, Swift가 허락한 괴짜적 사고를 소개하고자 합니다
그게 무엇이냐~
바로 함수의 return type을 정해놓고,
함수 호출을 할 때 return을 해버리지 않는 것입니다
⎮ playground와 project 환경에서의 차이
만약 처음 playground에서 학습을 하셨다면, 아래와 같은 형태는 익숙하실 겁니다
func greetUser() -> String {
return "유저님 반갑습니다"
}
greetUser()
그런데, 같은 형태의 코드를 project에서 작성하고
viewDidLoad 시점에 호출하면 다음과 같은 노란색 경고를 만나게 됩니다
노란색 경고를 자세히 봅시다
Result of call to 'greetUser()' is unused
greetUser()를 호출을 했는데, 해당 값을 사용하지 않았다는 에러입니다
Playground는 인터렉티브한 학습, 테스트 환경이라서
리턴값이 사용되지 않더라도 내부적으로 결과를 콘솔에 출력해줍니다
그래서 다음과 같은 경고는 필요가 없습니다
그러나 Project는 Compiler에 의해서 규칙이 적용됩니다
따라서 함수의 리턴 값을 무시하면 다음과 같은 경고를 띄워줍니다
Compiler는 엄격한 심사위원입니다
다만 우리가 이 엄격한 친구에게 통과를 받을 수 있는 방법이 있는데,
바로 discarableResult라고 명시해주는겁니다
"나 이거 리턴 값 안쓸거야"
⎮ @discardableResult
Swift에 붙어 있는 이 '@'는 Attributes Keyword로 컴파일러에게 추가적인 정보를 제공하는 키워드입니다
그 중 discardableResult 키워드에 대해 swift language에는 다음과 같이 쓰여있습니다
"값을 반환하는 함수 또는 메서드의 결과를 사용하지 않고 호출할 때 컴파일러가 경고를 표시하지 않도록 함수 또는 메서드에 이 속성을 적용합니다."
사용법은 아주 간단합니다
그냥 return Type을 사용하지 않으려고 하는 함수 앞에 이 키워드를 붙여주면 됩니다
class testViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
greetUser()
}
@discardableResult func greetUser() -> String {
return "유저님 반갑습니다!"
}
}
⎮ 언제 쓰는데요?
사실 이 괴짜적 사고는 괴짜적 사고가 아닙니다
애플이 이 keyword를 친히 만들어줬다는 것은 분명히 누군가의 시행착오가 쌓였다는 것이고, 어딘가에 쓰이고 있겠죠?
그러면 이 discarableResult. 대체 언제 쓸 수 있을까요?
임의의 textField에서 이메일에 대한 유효성 검사를 한다고 해보겠습니다
func validateEmail(_ email: String) -> Bool {
let userInput = emailTextField.text ?? ""
guard userInput.contains("@") else {
print("이메일에 '@'가 없습니다")
return false
}
guard userInput.count >= 5 else {
print("이메일이 너무 짧습니다. 다시 확인해주세요")
return false
}
return userInput.contains(db)
}
email을 DB와 비교해서 일치하는 값이 있으면 true를 리턴하고,
해당 boolean 값에 따라 다음 화면을 push해주고자 합니다
그런데 만약 다음 화면이 준비되어 있지 않다면 어떻게 해야할까요?
유효성 검사 자체도 못하는걸까요?
이럴 때 discarableResult를 쓰면, print 로그를 통해 유효성 검사를 할 수 있습니다
@discardableResult
func validateEmail(_ email: String) -> Bool {
let userInput = emailTextField.text ?? ""
guard userInput.contains("@") else {
print("이메일에 '@'가 없습니다")
return false
}
guard userInput.count >= 5 else {
print("이메일이 너무 짧습니다. 다시 확인해주세요")
return false
}
return userInput.contains(db)
}
이처럼 user가 잘못된 입력을 입력하게 되면,
다음 화면의 준비 여부와는 상관없이 내부적으로 정의된 로직을 수행하고
bool 값은 사용하지 않아도 됩니다
⎮ reference
Base: SeSAC 내부 비공개 강의 자료
https://bbiguduk.gitbook.io/swift/language-reference/attributes#discardableresult
속성 (Attributes) | Swift
선언과 타입에 정보를 추가합니다. Swift 에는 두 종류의 속성 (attributes) 이 있습니다 — 선언에 적용하는 속성과 타입에 적용하는 속성이 있습니다. 속성은 선언 또는 타입에 대한 추가적인 정보
bbiguduk.gitbook.io
https://green1229.tistory.com/367
@discardableResult를 왜 쓰지?
안녕하세요. 그린입니다🍏 이번 포스팅에서는 @discardableResult에 대해 왜 쓰는지 어떨때 쓰는지에 대해 학습해보겠습니다🙋🏻 의문의 시작점 사실 @discardableResult에 대해 문득 왜 써야되는지 궁
green1229.tistory.com