안녕하세요. 엘림입니다🙇🏻‍♀️

Swift 공식 문서 정독하기 2편(?)입니다!
가끔 필요할때만 들어가서 봤는데, 한번은 쭉 읽어보는게 좋을 것 같아서 시작하게 되었어욥.

제 스타일대로 정리했으니 추가적으로 더 필요한 정보는
공식문서 링크를 눌러 확인해주세용!

사실 저는 거의 한국어로 번역된 사이트를 확인했습니다!

자, 그럼 시작해볼까요

이 글은 공부하면서 작성한 글이기 때문에 잘못된 정보가 있을 수 있습니다.🥺
금방 잊어버릴... 미래의 저에게 다시 알려주기 위한 글이다보니
혹시라도 틀린 부분이 있다면, 댓글로 친절하게 알려주시길 부탁드립니다.🙏


기본 연산자

Swift에서 통상적으로 이용하는 +,-,/,% 같은 산술 연산자와
&&, || 같은 논리 연산자,
a..<b, a...b 같은 범위를 지정할 수 있는 범위 연산자 에 대해 알아보겠습니다.

관련해서는 애플 공식문서의 연산자 선언에서도 확인하실 수 있습니다.

용어

연산자에는 단항(unary), 이항(binary) 그리고 삼항(ternary) 연산자가 있습니다.

단항 연산자는 -a, !b, c!와 같이 하나의 대상에 앞뒤에 바로 붙여 사용하는 연산자입니다.
이항 연산자는 2 + 3 같이 두 대상 사이에 위치하는 연산자이며, 중위 연산자라고도 합니다.
삼항 연산자는 a ? b : c 형태로 Swift에 삼항 연산자는 이 연산자 단 하나만 존재합니다.

할당 연산자

할당 연산자는 값을 초기화 시키거나 변경합니다.
C나 Objective-C와는 다르게 Swift에서는 할당 연산자는 값을 반환하지 않습니다.

let b = 10
var a = 5
a = b
// a 값은 10


let (x, y) = (1, 2)
// x 는 1, y 값은 2 가 됩니다.

if x = y {
    //  x= y 는 값을 반환하지 않기 때문에 이 문법은 올바르지 않습니다.
}

사칙 연산자

Swift는 모든 숫자 형에서 사용 가능한 4가지 표준 사칙 연산자를 지원합니다.

  • 덧셈 (+) // 덧셈 연산자는 문자열을 합치기 위해 사용할 수 있습니다.
  • 뺄셈 (-)
  • 곱셉 (*)
  • 나눗셈 (/)

C나 ObjectiveC와 달리 Swift는 사칙 연산의 값이 오버플로우 되는 것을 허용하지 않습니다. 만약 이것을 허용하고 싶으면 Swift의 오버플로우 연산자를 이용해 지원할 수 있습니다.

나머지 연산자

  • 나머지 (%)
print(9 % 4) // 1
print(9 % -4) // 1
print(-9 % -4) // -1
print(-9 % 4) // -1

나머지 연산자의 앞쪽 수가 음수라면 결과값도 음수이며, 연산자의 뒤쪽 음수는 결과값에 영향을 미치지 않습니다.

단항 연산자

let three = 3
let minusThree = -three       // -3
let plusThree = -minusThree   //  3

let minusSix = -6
let alsoMinusSix = +minusSix  // -6

숫자 값은 - 연산자에 의해 부호가 변하지만, + 연산자 부호로는 아무런 영향도 받지 않습니다.

합성 할당 연산자

var a = 1
a += 2
// a는 3

합성 할당 연산자는 값을 반환하지 않습니다. 즉, let b = a+=2와 같은 문법은 사용할 수 없습니다.

비교 연산자

  • 같다 (a == b)
  • 같지않다 (a != b)
  • 크다 (a > b)
  • 작다 (a < b)
  • 크거나 같다 (a >= b)
  • 작거나 같다 (a <= b)
1 == 1   // true
2 != 1   // true
2 > 1    // true
1 < 2    // true
1 >= 1   // true
2 <= 1   // false

let name = "world"
if name == "world" {
    print("hello, world")
} else {
    print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world"

7개 미만의 요소를 갖는 튜플도 비교할 수 있습니다. (그 이상의 요소를 갖는 경우 직접 비교 연산자를 구현해야 합니다.)
비교는 왼쪽에서 오른쪽 방향으로 이뤄지고, 한번에 한개의 값만 비교합니다. 두 개를 비교했을때 다른 경우 멈추고, 같다면 오른쪽 요소로 이동하여 또 비교합니다.
튜플을 비교할 떄에도 비교 연산자가 해당 값을 비교할 수 있는 경우에만 비교를 수행할 수 있습니다.

(1, "zebra") < (2, "apple")   // true, 1이 2보다 작고; zebra가 apple은 비교하지 않기 때문
(3, "apple") < (3, "bird")    // true 왼쪽 3이 오른쪽 3과 같고; apple은 bird보다 작기 때문
(4, "dog") == (4, "dog")      // true 왼쪽 4는 오른쪽 4와 같고 왼쪽 dog는 오른쪽 dog와 같기 때문
("blue", false) < ("purple", true)  // 에러!! Boolean 값은 < 연산자로 비교할 수 없기 때문

식별 연산자

  • 같은 객체이다 (===)
  • 같은 객체가 아니다 (!==)

삼항 조건 연산자

삼항 조건 연산자는 question ? answer1 : answer2의 구조를 갖습니다. 그래서 question 조건이 참인경우 answer1이 거짓인 경우 answer2가 실행됩니다.
삼항 조건 연산자는 코드를 짧게 만들어 가독성을 높여줍니다.

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

💡 1번 링크2번 링크에 아래 Nil 병합 연산자와 삼항 조건 연산자 등을 자제하면 속도를 향상시킬 수 있다는 내용이 있네요!

Nil 병합 연산자

nil 병합 연산자는 a ?? b 형태를 갖는 연산자 입니다. 옵셔널 a를 벗겨서(unwraps) 만약 a가 nil 인 경우 b를 반환합니다.
a != nil ? a! : b코드의 축약형입니다.

let defaultColorName = "red"
var userDefinedColorName: String?   // 옵셔널 타입의 defaults는 nil입니다.

var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorNam이 nil이므로 colorNameToUse 값은 defaultColorName인 "red"가 설정 됩니다.

userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName가 nil이 아니므로 colorNameToUse 는 "green"이 됩니다.

범위 연산자

닫힌 범위 연산자

(a...b)와 같이 표현됩니다.
a부터 b까지의 숫자를 나타내며, a와 b를 모두 포함합니다. (a가 b보다 클 수 없습니다.)

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
    print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack

반 닫힌 범위 연산자.

(a..<b)의 형태로 a부터 b보다 작을 때까지의 범위를 갖습니다. 즉, a부터 b-1까지 값을 갖습니다.

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
    print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack

단방향 범위 연산자

[a..], [..a], [..<a]의 형태로 범위의 시작 혹은 끝만 지정해 사용하는 범위 연산자 입니다. 지정한 시작 값 혹은 끝 값은 범위에 포함됩니다.

for name in names[2...] {
    print(name)
}
// Brian
// Jack

for name in names[...2] {
    print(name)
}
// Anna
// Alex
// Brian

for name in names[..<2] {
    print(name)
}
// Anna
// Alex

단방향 범위 연산자는 subscript뿐만 아니라 특정 값을 포함하는지 여부를 확인할 때도 사용 가능합니다.

let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true

논리 연산자

논리 부정

  • NOT (!a)
let allowedEntry = false
if !allowedEntry {
    print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"

논리 곱

  • AND (a && b)
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"

논리 합

  • OR (a || b)
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "Welcome!"

논리 연산자 조합

두 개 이상의 논리 연산자를 조합해서 사용할 수 있습니다.
Swift의 논리 연산자 && 와 || 는 왼쪽의 표현을 우선해서 논리 계산을 합니다.

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "Welcome!"

명시적 괄호

논리 연산자의 적용 우선 순위를 연산자에 맡지기 않고 명시적으로 괄호를 사용해 계산 순서를 지정할 수 있습니다.
이렇게 괄호를 사용하면 가독성이 높아져 코드의 의도를 더 명확하게 하는데 도움이 됩니다.

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "Welcome!"

오늘은 스위프트 공식문서에서 두번째 챕터인 Basic Operatiors를 읽어보았습니다~
다음에는 Strings and Characters를 읽어보도록 하겠습니다!

감사합니다🙇🏻‍♀️

profile
한달 차 iOS 개발자입니다🐥

0개의 댓글