Swift의 if문에서 ‘,’와 ‘&&’의 차이

업데이트:

Swift의 if문에서 쉼표와 두 개의 앰퍼샌드의 차이에 대해 설명하는 글입니다

안녕하세요😀 오늘은 Swift의 if문에서 쉼표와 두 개의 앰퍼샌드의 차이에 대해 알아보려고해요!

개발을하다가 문득 ‘,’와 ‘&&’은 똑같은 역할을 하는 게 아닐까라는 생각을 했는데 구글링을 해보니 스택오버플로우에 그 답변이 있더라구요!! 그래서 오늘은 이 답변을 토대로 Swift의 if문에서 콤마와 두 개의 앰퍼샌드의 차이를 정리해보겠습니당😆

스택오버플로우 질문은 다음과 같습니다.

if let a = someOpt, b = someOtherOpt {}

이 코드를 실행하면 내가 원하는 결과가 나온다.

if let a = someOpt && b = someOtherOpt {}

이 코드는 오류가 발생한다.

if 1 == 1, 2 == 2 {}
if 1 == 1 && 2 == 2 {}

하지만 이 코드를 실행하면 같은 결과가 나온다. 그렇다면 콤마는 복수의 조건을 평가하는데 허용된 방법이며, 두개의 앰퍼샌드와 같은가 아니면 기술적으로 다른가?

저도 코딩할때마다 이 부분이 굉장히 궁금했는데 이번 기회로 궁금중을 풀 수 있었어요!

스택오버플로우의 추천수가 가장 높은 답변에서는 이렇게 설명합니다. if문에서 두 개 이상의 조건을 사용할 때, 첫 번째 조건이 옵셔널 바인딩이라면 두 번째 조건이 옵셔널 바인딩이 아니라도 두 개의 앰퍼샌드를 사용할 수 없습니다! 즉, 옵셔널 바인딩을 사용한 조건과 옵셔널 바인딩이 아닌 조건사이에도 두 개의 앰퍼샌드를 사용할 수 없다는 것이죠.

하지만 저는 그 이유가 궁금했습니다. 그래서 좀 더 생각해봤는데요.

if 1 == 1, 2 == 2 {}
if 1 == 1 && 2 == 2 {}

이렇게 옵셔널 바인딩을 사용하지 않는 if문에서 콤마와 두 개의 앰퍼샌드는 같은 역할을 하고 있는게 맞아요! 그래서 코드의 결과도 같습니다. 하지만 콤마와 앰퍼샌드의 차이는 옵셔널 바인딩을 사용할 때 나타납니다.

static func && (lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool

두 개의 앰퍼샌드는 두 개의 Bool값에 대해 논리적 AND 작업을 수행합니다. 연산하는 두 개의 값이 모두 Bool 타입이어야 한다는 것이죠. 따라서 옵셔널 바인딩의 결과는 Bool 타입이 아니기 때문에 연산이 불가능한거에요!!!!!

제 예상이지만 콤마에는 옵셔널 바인딩의 결과가 nil일때 바로 조건의 비교를 중단하기 때문에 옵셔널 값과 Bool값, 또는 옵셔널과 옵셔널 값에 대한 연산을 할 거 같네요.

드디어 답을 찾았습니다… 콤마가 정의되어 있는 부분은 찾을 수가 없네요ㅠㅠ

댓글남기기