[swift] if 문에서 콤마와 && 연산자의 차이점

[swift] if 문에서 콤마와 && 연산자의 차이점

코딩을 하다가 Bool? 타입의 변수에 true값이 왔는지를 체크하다가 우연히 찾게된 코드를 보고
이해하기 위해서 정리 해놓습니다. 원래 사용했던 코드는 아래와 같았습니다.

let result: Bool?

if let result = result {
    if result {
        print("result is true")
    } else {
        print("result is false")
    }
} else {
    print("result is nil")
}

옵셔널일 때 값이 있는지 없는지를 검증하고 나서 그 안의 값을 사용하는 코드를 짰었습니다.
하지만 실제로 false일 때의 경우에는 아무런 행동을 하지 않았기 때문에 else라인은 비어있었습니다.

논리 적으로 아래 코드와 같이 써서 사용할 수 있을 줄 알았는데 동작하지 않았습니다.

if let result = result && result {
    print("result is true")
}

if let으로 옵셔널을 제거 해 준 후에 사용할 수 있기 때문입니다. 검색을 통해 찾아보니 이럴 때 comma를 이용해 코드를 명확하게 짤 수 있었습니다.

let result: Bool? = false

if let result = result , result {
    print("result is true")
} else {
    print("result is nil or false")
}

막상 짜 놓고 보니 &&와 comma가 왜 다른지 이 구문이 어떻게 동작하는지에 대해 잘 모르고 있었기에 정리 해 놓겠습니다.

공식 문서의 if Statement 부분을 참고해보니 이런 내용이 있었습니다.

if Statement

if 문 뒤에 조건이 오시는것은 다들 알고 계실꺼에요. 그러면 조건은 무엇일까요?
정확히 문서에는 if condition-list 라고 되어있습니다.

condition-list → condition | condition , condition-list

를 가리킵니다.
즉 하나의 condition이 와도 되고, condition와 condition을 ,(comma) 로 엮어 만든 condition-list가 올 수 있습니다.

그렇다면 condition은 무엇일까요?

condition → expression | availability-condition | case-condition | optional-binding-condition

크게 이 네가지가 컨디션이 될 수 있습니다.

그 중 하나인 이 expression를 살펴보겠습니다.

expression → try-operator(opt) prefix-expression binary-expressions(opt)

이렇게 구성되어 있습니다. 하나씩 살펴보면 / | = | - | + | ! | * | % | < | > | & | | | ^ | ~ | ? 이런 연산자를 쓴 식 입니다.

Comma VS &&

처음으로 돌아와서

if let result = result && result {
if let result = result , result {

이 두 구문이 어떻게 다른 것 일까요?
첫 번째 구문은 하나의 expression입니다. 양쪽의 A && B 를 논리연산자로 계산해 참, 거짓의 결과를 가져옵니다.
두 번쨰 구문은 expression, expression 으로 이루어진 condition-list 입니다. 즉 두개의 expression이 각 각 참이 되어야 if문이 실행됩니다.
옵셔널 바인딩이 성공하고, 그 값이 참이어야 실행되는 코드를 만들 수 있겠죠.

정리

comma(,)를 이용해서 스위프트에서는 condition-list를 만들 수 있습니다. 여러개의 조건을 순처적으로 실행하고 모두 참이 되어야 한다면,
&& 연산자 말고 comma(,)를 이용해 보는 것을 어떨까요?

donaricano-btn

댓글

이 블로그의 인기 게시물

[IOS] AppDelegate는 뭐하는 녀석이지?

[git] git의 upstream과 origin 헷갈리는 사람 손!

[git] Github 이슈 라벨(issue labels)