연산자에는 단항, 이항 그리고 삼항 연산자가 있다.
-a, !b, c!
와 같이 하나의 대상에 앞뒤에 바로 붙여 사용하는 연사자이다.2 + 3
같이 두 대상 사이에 위치하는 연산자이다.a ? b : c
형태로 Swift에 삼항 연산자는 이 연산자 단 하나만 존재한다.할당 연산자는 값을 초기화 시키거나 변경한다.
상수, 변수 모두에 사용 가능하다.
let b = 1
var a = 2
a = b
// a의 값은 10
튜플을 이용해 여러 값을 한번에 할당할 수 있다.
let (x, y) = (3, 4)
// x는 3, y는 4의 값이 저장
Swift는 모든 숫자 형에서 사용 가능한 4가지 표준 사칙 연산자를 지원한다.
1 + 2 // 3
4 - 3 // 1
5 * 6 // 30
9.0 / 4.5 // 2.0
Swift는 사칙 연산의 값이 오버플로우 되는 것을 허용하지 않는다.
만약 허용하고 싶다면 오버플로우 연산자를 이용해 지원할 수 있다.
덧셈 연산자는 문자열을 합치기 위해 사용할 수 있다.
"hello, " + "world"
// equals "hello, world"
a % b
와 같이 나머지 연산을 지원한다.
9 % 4 // 1
-9 % 4 // -1
숫자 값은 -
로 표현되는 단항 음수 연산자에 의해 부호가 변한다.
let three = 3
let minusThree = -three // minusThree == -3
let plusThree = -minusThree // plusThree == 3
+
로 표현되는 단항 양수 연산자는 부호에 아무런 영향을 끼치지 않는다.
let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix == -6
a = a + 2 와 같이 할당연산(=)과 덧셈연산(+)으로 구성된 연산을 합성해 +=
형태로 축약해 사용 가능하다.
var a = 1
a += 2
// a == 3
주의
합성 할당 연산자는 값을 반환하지 않는다. 즉,let b = a += 2
와 같은 문법은 사용할 수 없다.
Swift에서는 표준 C에서 제공하는 비교 연산자를 모두 지원한다.
각 비교연산은 ture 혹은 false 값을 반환한다.
1 == 1 // true
2 != 1 // true
2 > 1 // true
1 < 2 // true
1 >= 1 // true
2 <= 1 // false
비교 연산은 if-else와 같은 조건 구문에서 자주 사용된다.
let name = "seongbin"
if name == "seongbin" {
print("hi, seongbin")
} else {
print("who are you, \(name)?")
}
// Prints "hi, seongbin"
같은 타입의 값을 갖는 두 개의 튜플을 비교할 수 있다.
튜플의 비교는 왼쪽에서 오른쪽으로 이뤄지고 한번에 한개의 값만 비교한다.
이 비교는 서로 다른 두 값을 비교하게 될 때까지 수행한다.
( 1, "apple" ) < ( 2, "bird" ) // true
( 3, "cat" ) < ( 3, "dog" ) // true
( 4, "egg" ) == ( 4, "egg" ) // true
튜플은 비교 연산자가 해당 값을 비교할 수 있는 경우에만 비교를 수행할 수 있다.
( "blue", -1 ) < ( "purple", 1) // true
( "a", false ) < ( "b", true ) //error, Boolean 값은 < 연산자로 비교할 수 없다.
삼항 조건 연산자는 question ? answer1 : answer2
의 구조를 갖는다.
question
조건이 true인 경우 answer1
이 false인 경우 answer2
가 실행된다.
삼항 조건 연산자는 if-else 코드의 축약이다.
if question {
answer1
} else {
answer2
}
삼항 조건 연산의 실제 예시
let contentHeight = 40
let hasHeader = true
let rorwHeight = contentHeight + ( hasHeader ? 50 : 30 )
// rowHeight == 40 + 50 == 90
삼항 조건 연산자는 코드를 짧게 만들어 가독성을 높여준다.
nil 병합 연산자는 a ?? b
형태를 갖는 연산자이다.
옵셔녈 a
를 벗겨서 만약 a
가 nil
인 경우 b
를 반환 한다.
이 nil
병합 연산자는 다음 코드의 축약형이다.
a != nil ? a! : b
삼항 조건 연산자를 사용했는데,
옵셔널 a
가 nil
이 아니라는 것이 true이면 a
를 unwrap하고,
옵셔널 a
가 nil
이 아니라는 것이 false 이면 b
를 반환하라는 의미이다.
이해를 돕기 위한 예시
let defaultName = "seongbin"
var userDefindedName: String? // 이 값은 defaults 값이 nil
var nameToUse = userDefindedName ?? defaultName
// userDefindedName 값이 nil이므로,
// nameToUse 값은 defaultName인 "seongbin"
userDefindedName = "Lim"
nameToUse = userDefindedName ?? defaultName
// userDefindedName 값이 nil이 아니므로,
// nameToUse 값은 "Lim"
(a..b)
의 형태로 범위의 시작과 끝이 있는 연산자이다.
for-in loop에서 자주 사용된다.
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
(a..<b)
의 형태로 a
부터 b
보다 작을 때까지의 범위를 갖는다.
즉, a
부터 b-1
까지 값을 갖는다.
보통 배열이 배열의 크기 -1의 인덱스를 갖기 때문에 이 반 닫힌 범위 연산자는 배열을 다루는데 유용하다.
let names = [ "짱구", "철수", "훈이", "맹구", "이슬" ]
let count = names.count
for i in 0..<count {
print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called 짱구
// Person 2 is called 철수
// Person 3 is called 훈이
// Person 4 is called 맹구
// Person 5 is called 이슬
[a..]
[..a]
의 형태로 범위의 시작 혹은 끝만 지정해 사용하는 범위 연산자이다.
지정한 시작 값 혹은 끝 값은 범위에 포함된다.
for name in names[2...] {
print(name)
}
// 훈이
// 맹구
// 이슬
for name in names[...2] {
print(name)
}
// 짱구
// 철수
// 훈이
단방향 범위 연산자는 subscript뿐만 아니라 아래와 같이 특정 값을 포함하는지 여부를 확인할 때도 사용 가능하다.
let range = ...5
range.contains(7) // false
range.contains(4) // true
range. contains(-1) // true
Swift에서는 세가지 표준 논리 연산자를 지원한다.
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
두 개 이상의 논리 연산자를 조합해서 사용할 수 있다.
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
Swift의 논리 연산자 &&
와 ||
는 왼쪽의 표현을 우선해서 논리 계산한다.
논리 연산자의 적용 우선 순위를 연산자에 맡기지 않고 명시적으로 괄호를 사용해 계산 순서를 지정할 수 있다.
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
괄호를 사용하면 가독성이 높아져 코드의 의도를 명확하게 파악 하는데 도움이 된다.