앞선 글에서도 언급했듯, UIButton의 style의 디폴트는 Default가 아닌 Plain입니다. 그렇기 때문에, 이전 버전에서 작성된 영상 강의를 그대로 따라하다가는 예기치 못한 오류를 마주치는 경험을 할 수 있습니다. 그러한 오류를 해결하는 과정과, 더 나아가 해당 오류와 같은 상황을 더 안전하게 처리하는 방식에 대해 정리해보았습니다.
UIButton
을 sender로 갖는 함수에서, 해당 버튼의 title을 출력하고 싶다면, 어떻게 해야할까요? UIButton.currentTitle 공식 링크에서 확인할 수 있듯, 옵셔널 형태의 String 타입을 갖는 프로퍼티를 호출할 수 있습니다.하지만 단순히 호출하는 것만으로는 xcode상의 warning이 발생하게 됩니다. nil
값을 가질 수 있는 타입인 String?
을 특별한 옵션없이 호출하게 되면, 위 사진처럼 nil값이 출력될 수 있기 때문입니다. 따라서 위 사진처럼 변수의 끝에 !
를 통해 이 변수의 값이 무엇이든, 강제로 추출하겠다는 의미를 갖습니다. 하지만 위 사진에서도 볼 수 있듯, 강제 추출은 런타임 오류가 발생하기 가장 쉬운 환경입니다. UIButton
의 title이 nil
이기 때문에 발생한 오류인데, Attribute Inspector에서 확인할 수 있는 title은 분명 각각 soft, medium, hard 였습니다. 이 문제는 역시 기본으로 지정된 style을 plain
에서 Default
로 수정한 후에 해결되었습니다.
강제 추출을 통해 확인하는 방식이 가장 직관적이고, 빠른 방식이지만 런타임 에러가 발생한다는 점은 출시를 목표로 하는 어플에게는 치명적인 문제입니다. 런타임 에러를 방지하면서 nil
값을 효과적으로 처리하기 위해서는 옵셔널 바인딩 이라는 방법을 활용하도록 하겠습니다.
// 기존의 방식
@IBAction func eggPressed(_ sender: UIButton) {
print(sender.currentTitle!)
}
// 옵셔널 바인딩을 활용
@IBAction func eggPressed(_ sender: UIButton) {
if let title = sender.currentTitle {
print(title)
} else {
print("title is nil")
}
}
옵셔널 바인딩은 위의 코드처럼, if let
을 활용합니다. 문법 그대로, 만약 if let
을 활용해 선언한 변수 title
이 할당된다면 (즉, 할당 대상인 sender.currentTitle
이 nil
이 아니라면) print(title)
을 실행하고, 그렇지 않다면 else
문의 내용을 출력하는 방식입니다. 이를 통해 강제 추출 방식보다 안전하게 옵셔널의 값을 확인 할 수 있고, else문의 수정을 통해 nil
값이 들어온 경우의 처리를 더 자유롭게 할 수 있습니다.