'if' must have an unconditional 'else' to be used as expression 에러

이재웅 (Curry)·2023년 9월 20일
2
post-thumbnail

에러상황

Xcode 15로 업데이트 하고 프로젝트 빌드를 하려는데 기존에 없던 컴파일 오류가 생겼다.

기존 코드의 상황은 다음과 같았다.

func example() {

	...메소드 로직들...

	return // 함수 종료시점. 아래의 코드는 실행되지 않음
    
	// 목적이 불분명해 함부로 지우지 못하고 남겨두었던 레거시 코드
    if ~~~~ { // 에러발생!! : 'if' must have an unconditional 'else' to be used as expression
    
    }
}

에러원인

Xcode 15와 함께 새로 업데이트된 Swift 5.9 버전에서 if/Switch의 조건문 표현식이 생겼다. 그로 인해 return이 작성된 다음 줄에 if문이 있을 경우, 반드시 else를 표기해야 된다는 컴파일 에러였다.

이전에는 return 하단에 작성되는 코드는 if문이던 아니던 실행되지 않는다는 경고문만 뜨고, if문은 본래 else를 표기하지 않아도 문제되지 않았는데 왜 이런 오류가 새로 생겼을까?

Swift 5.9에서 새로 생긴 '조건문 표현식'에 대해 좀 더 알아보자.

조건문 표현식 (Conditional Expression)

기존에는 조건문을 이용해 변수를 선언해야 한다면 다음과 같이 선언했다.

// Swift 5.9 이전
let 학점: String
var 점수 = 60

switch 점수 {
case 51...70:
    학점 = "D"
case 71...80:
    학점 = "C"
case 81...90:
    학점 = "B"
case 91...100:
    학점 = "A"
default:
    학점 = "F"
}

Swift 5.9 부터는 다음과 같이 선언이 가능하다.

// Swift 5.9
var 점수 = 60
let 학점: String = switch 점수 {
case 51...70:
    "D"
case 71...80:
    "C"
case 81...90:
    "B"
case 91...100:
    "A"
default:
    "F"
}

swift-evolution에서 제안된 proposal을 보면, 조건문, 삼항 연산자의 가독성이 떨어지기 때문에 개선시키기 위해 새롭게 도입되었다고 하였다.

따라서 위에 예시와 같이 변수선언 시에 변수선언과 동시에 조건문을 사용함으로써 가독성을 높일 수 있게 되었다.

또한 아래와 같이 return문에서도 조건문 표현식이 사용 가능해졌다.

func greeting(num: Int) -> String {
    return if num == 0 {
        "안녕"
    } else {
        "안녕하지 못해"
    }
}

let 인사 = greeting(num: 0)

print(인사) // 출력 : 안녕

return문에서도 사용이 가능하다라...

그렇다면 초기에 내가 만났던 에러상황과 같이 return문과 조건문의 줄간격을 띄워보도록 하자.

그렇게 return문과 조건문의 줄간격을 띄우고 나니 다음과 같은 경고가 나타났다.

Expression following 'return' is treated as an argument of the 'return'

return 뒤에 오는 표현식은 return의 인수로 취급된다는 경고다.

다음과 같은 상태로 실행 하더라도 위의 예시와 같이 정상적으로 조건문의 String이 리턴된다.

이 경고문을 통해 내 코드의 원인을 확실하게 파악할 수 있었다.

  1. 기존 메소드의 return 하단의 코드는 이미 함수가 종료된 상황이라 실행되지 않음, 컴파일 오류가 발생하지 않음.
  2. Swift 5.9 부터 return 뒤에 오는 표현식은 인수로 취급됨. 따라서 기존에 있던 return문 하단의 if문 코드는 인수로 취급되어 조건문 표현식이 적용됨.
  3. 조건문 표현식이 적용될 경우, 모든 조건에 대한 처리가 필요함. if문의 경우 else문을 써줘야 모든 조건처리가 가능해짐. 따라서 기존 코드에 else문이 없어 조건문 표현식을 완성하지 못했기 때문에 컴파일 에러 발생!

마무리

코드를 한 줄이라도 깔끔하게 만들고 싶어하는 나로써 이번에 업데이트된 조건문 표현식은 매우 반갑다. 정확히 나의 불편한 점을 꼬집어 해결해준 느낌이랄까...

이 문제를 해결하게 되었으니, 이제 Xcode 15에서 프로젝트가 잘 빌드되고 실행되기만을 바랄 뿐이다. (ㅜㅜ)


[참고링크]
The Swift Programming Language (5.9) - Conditional Expression
Github, apple/swift-evolution - if and switch expressions

profile
iOS 개발자 이재웅입니다.

0개의 댓글