소피it블로그

[Swift 공식문서] 삼항 연산자와 Nil 병합 연산자 본문

개발_iOS/스위프트

[Swift 공식문서] 삼항 연산자와 Nil 병합 연산자

sophie_l 2022. 8. 18. 13:51

https://docs.swift.org/swift-book/LanguageGuide/BasicOperators.html

 

Basic Operators — The Swift Programming Language (Swift 5.7)

Basic Operators An operator is a special symbol or phrase that you use to check, change, or combine values. For example, the addition operator (+) adds two numbers, as in let i = 1 + 2, and the logical AND operator (&&) combines two Boolean values, as in i

docs.swift.org

개인적으로 Ternary 연산자와 옵셔널의 nil-coalescing 연산자가 개념상(X) 표현상(O) 헷갈려서 정리해보려고 한다.

 

1. Ternary Conditional Operator

 

삼중 조건 연산자, 즉 삼항 연산자는 세 부분으로 되어 있는 특별한 연산자로, question ? answer1: answer2의 형태를 띈다. 이는 질문이 참일 때와 거짓일 때에 따라 달라지는 표현을 간략하게 나타낸 것이다. 질문이 true라면 답1의 값을 리턴하고, false라면 답2의 값을 리턴한다.

삼항 연산자는 이하의 코드를 줄인 것이다.

if question {
    answer1
} else {
    answer2
}

 이하는 테이블의 로우의 높이를 계산해주는 예시이다. 로우의 높이는 로우가 헤더를 가질 경우 내용보다 50포인트 더 커야 하고, 헤더가 없을 경우 20포인트 더 커야 한다.

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight is equal to 90

위의 예시는 아래의 코드를 줄인 것이다.

let contentHeight = 40
let hasHeader = true
let rowHeight: Int
if hasHeader {
    rowHeight = contentHeight + 50
} else {
    rowHeight = contentHeight + 20
}
// rowHeight is equal to 90

첫 번째 예시에서 삼항 연산자를 사용함으로써 rowHeight는 단 한 줄의 코드를 통해 적절한 값을 설정받을 수 있게 된다. 이는 두 번째 예시의 코드보다 훨씬 간결하다.

삼중 조건 연산자는 두 가지 표현 중 어떤 것을 골라야 할지에 대한 효율적인 방법을 제공한다. 그러나 사용할 때 주의해야 한다. 간결하기 때문에 너무 남용하면 코드의 가독성이 떨어지기 때문이다. 하나의 복합 statement 안에 여러 개의 삼항 연산자를 혼용하여 사용하는 것은 피하는 게 좋다.

 

2. Nil-Coalescing Operator

 

nil 병합 연산자(a ?? b)옵셔널 a에 값이 있다면 이를 언래핑하고, nil일 경우 디폴트 값인 b를 리턴한다. a는 항상 옵셔널 타입이다. b는 a 안에 저장된 타입과 반드시 일치해야만 한다. nil 병합 연산자는 이하와 같은 코드를 축약한 것이다.

a != nil ? a! : b

위의 코드는 삼항 연산자를 사용하여 a가 nil이 아닐 경우 a 안에 래핑되어있는 값에 접근하기 위해 강제 언래핑(a!)을 하며, 그렇지 않을 경우 b를 리턴한다. nil 병합 연산자는 이 조건 확인과 언래핑을 더 간결하고 읽기 쉬운 형태로 포장하는 방법을 제공한다.

이하의 예시는 nil 병합 연산자를 사용하여 디폴트 색상명과 유저가 정의한 옵셔널 색상명 사이에서 하나를 고르도록 한다.

let defaultColorName = "red"
var userDefinedColorName: String?   // defaults to nil

var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName is nil, so colorNameToUse is set to the default of "red"

userDefinedColorName 변수는 옵셔널 문자열로 정의되어 있으며, 디폴트 값은 nil이다. userDefinedColorName이 옵셔널 타입이기 때문에 그 값을 판단하기 위해 nil-coalescing 연산자를 사용해줄 수 있다. 위의 예시에서는 연산자가 colorNameToUse라는 문자열 변수의 초깃값을 결정하기 위해 사용된다. userDefinedColorName이 nil이기 때문에, userDefinedColorName ?? defaultColorName은 defaultColorName의 값인 "red"를 반환한다.

userDefinedColorName에 nil이 아닌 값을 할당하고 nil-coalescing 연산을 다시 수행한다면, userDefinedColorName 안에 래핑되어있는 값이 디폴트 값 대신에 쓰인다.

userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName isn't nil, so colorNameToUse is set to "green"