본문 바로가기
프로그래밍/Swift

[Swift] Basic Operators

by 별준 2021. 12. 12.

References

Contents

  • Assignment Operators
  • Comparison Operators
  • Nil-Coalescing Operators
  • Range Operators

연산자(operator)는 그냥 스킵하려고 했는데, C 스타일과는 다른 부분이 몇 가지 있어서 그 부분만 체크하고 넘어가려고 합니다.

 


Assignment Operator

대입 연산자(a = b)는 a의 값을 b의 값으로 업데이트하거나 초기화할 때 사용됩니다.

let b = 10
var a = 5
a = b
// a is now equal to 10

여러 값을 갖는 튜플의 경우에도 다양한 대입이 가능합니다.

var a = (1, 2)
var (x, y) = (1, 2)
print(a)    // print (1, 2)
print(x, y) // print 1 2

 

그리고 C와는 다르게 swift에서 대입 연산자는 값을 리턴하지 않습니다. 따라서, 아래의 구문은 유효하지 않고 에러를 발생시킵니다.

if x = y {
    // This isn't valid, because x = y doesn't return a value.
}

이와 같은 기능은 실수로 '==' 대신 '='를 사용하는 것을 방지해줍니다.


Comparison Operators

Swift는 위와 같은 비교 연산자들을 지원합니다. 객체를 비교하기 위한 '==='과 '!=='도 지원합니다.

1 == 1   // true because 1 is equal to 1
2 != 1   // true because 2 isn't equal to 1
2 > 1    // true because 2 is greater than 1
1 < 2    // true because 1 is less than 2
1 >= 1   // true because 1 is greater than or equal to 1
2 <= 1   // false because 2 isn't less than or equal to 1

주로 if문의 조건문으로 자주 사용됩니다.

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

 

같은 타입과 같은 수의 값을 가지고 있는 튜플의 경우에 비교가 가능한데, 튜플에서의 비교는 왼쪽에서 오른쪽으로 가면서 한 번에 하나의 값만 비교하고, 두 값이 다를 때까지 비교는 계속됩니다.

(1, "zebra") < (2, "apple")   // true because 1 is less than 2; "zebra" and "apple" aren't compared
(3, "apple") < (3, "bird")    // true because 3 is equal to 3, and "apple" is less than "bird"
(4, "dog") == (4, "dog")      // true because 4 is equal to 4, and "dog" is equal to "dog"

첫 번째 줄의 튜플 비교에서 첫 번째 값인 1과 2가 서로 같이 않기 때문이 더 이상 비교는 없습니다.

두 번째 줄의 튜플 비교에서 첫 번째 값인 3과 3은 서로 같고, 두 번째 값들의 비교로 넘어가서 비교가 수행됩니다.

세 번째 줄의 튜플 비교도 두 번째와 마찬가지로 두 번의 비교가 수행됩니다.

 

튜플은 비교 연산자가 해당 값을 비교할 수 있는 경우에만 비교를 수행할 수 있습니다.

("blue", -1) < ("purple", 1)        // OK, evaluates to true
("blue", false) < ("purple", true)  // Error because < can't compare Boolean values

Nil-Coalescing Operator

nil 병합 연산자는 'a ?? b' 형태를 갖는 연산자입니다. 이 연산자는 만약 Optional a가 값을 가지고 있다면 unwrap하여 값을 사용하고, a가 nil라면 b를 기본값으로 리턴합니다. a는 항상 optional 타입이어야 하고, b는 a에 저장된 타입과 동일해야 합니다.

Nil-Coalescing 연산자는 아래 삼항 연산자의 축약형이라고 볼 수 있습니다.

a != nil ? a! : b
a가 non-nil 이라면, b의 값은 평가되지 않습니다. (short-circuit evaluation)

이 연산자는 아래처럼 사용할 수 있습니다.

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"

userDefineColorName 변수는 optional String으로 정의되었고 기본값이 nil 입니다. Nil-coalescing 연산자를 사용하여 colorNameToUse의 값을 초기화하는데, userDefineColorName이 nil이기 때문에 defaultColorName의 값이 리턴되어 colorNameToUse의 값은 "red"가 됩니다.

 

userDefinedColorName이 non-nil 이라면 userDefinedColorName으로 값이 초기화됩니다.

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

Range Operators

Swift는 다양한 범위 연산자를 제공합니다. 이는 값의 범위를 짧게 표현할 때 유용합니다.

Closed Range Operator

Closed Range Operator는 (a...b)로 작성하며, 이는 a부터 b까지 범위를 수행한다는 것을 의미합니다. a와 b를 모두 포함하고, a는 반드시 b보다 작아야 합니다.

이 연산자는 주로 for-in 루프에서 자주 사용됩니다.

for index in 1...5 {
    print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

Half-Open Range Operator

half-open range operator는 (a..<b)로 사용하고, a부터 b까지의 범위를 수행하는데 b는 포함하지 않습니다. 즉, a부터 b-1까지의 값을 갖는데, 보통 배열이 배열의 크기-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

One-Sided Ranges

[a..] 이나 [..a]의 형태로 범위의 시작 또는 끝만 지정해서 사용하는 범위 연산자입니다. 지정된 시작값 또는 끝값은 범위에 포함됩니다.

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names[2...] {
    print(name)
}
// Brian
// Jack

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

이 연산자는 subscript뿐만 아니라 특정 값을 포함하고 있는지 확인하는데도 사용할 수 있습니다.

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

 

댓글