
var myresult = 1 + 2
- 하나의 연산자 (operator) : ' + '
- 두 개의 피연산자 (operand) : 1과 2
- 할당자 (assignment) : ' = '
a = b b의 값을 a에 대입(할당)한다.
let b = 10
let a = 5
a = b
// a는 10
대입의 오른쪽 항이 튜플이라면 튜플의 요소는 여러개의 상수(변수)로 분해된다.
let (x,y) = (1,2)
// x는 1, y는 2
1+2 // 3 (덧셈)
5-3 // 2 (뺄셈)
2*3 // 6 (곱셈)
10.0 / 2.5 // 4.0 (나눗셈)
덧셈 연산자 + 는 String 연결도 지원한다.
"hello, " + "world" //hello, world
하나의 표현식 안에 여러 개의 연산자를 사용할 수도 있다.
x = y * 10 + z - 5 / 4
a % b a 안에 들어갈 b의 배수가 몇인지를 계산하고 남은 값을 반환한다.
a = (b x some multiplier) + remainder
some multiplier는 a에 들어갈 b의 최대 배수
9 % 4 // 1
// 9 = (4 x 2) + 1
숫자 값의 부호는 단항 뺄셈 연산자인- 접미사를 사용하여 변경할 수 있다.
let three = 3
let minusThree = -three // -3
let plusThree = -minusThree // 3
단항 덧셈 연산자는 어떠한 변경없이 그 값을 그대로 반환한다.
실제로 아무런 동작을 하지 않지만 양수와의 대칭을 위해 사용할 수 있다.
let minusSix = -6
let alsoMinusSix = +minusSix // -6
덧셈 대입 연산자 사용 예
var a1 = 1
a1 += 2 //a1 = a1 + 2
//a1 = 3
비교연산자는 프로그램 흐름 제어 로직을 만드는데 가장 많이 사용된다.
- 같음
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
//if구문에서 사용
let name = "world"
if name == "world" {
//name과 "world"가 갖기 때문에
//if문이 실행된다.
print("hello, world")
} else {
print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world"
조건문 ? 참(true)인 경우의 표현식 : 거짓(false)인 경우의 표현식
ex) question ? answer1 : answer2
question이 참 또는 거짓인지에 따라 2개의 표현식 중 하나를 나타내는 식
question이 참이면 answer1 반환 / 거짓이면 answer2 반환
삼항연산자는 아래의 코드를 줄여서 표현한 것이다.
if question { answer1 } else{ answer2 } //true면 answer1 //false면 answer2
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
//rowHeight의 값은 90(50+40)
nil-결합 연산자(??)를 사용하면 옵셔널에 nil 값이 있는 경우 디폴트 값을 사용할 수 있다.
a??b
a != nil ? a! : b
옵셔널 a에 값이 있다면 a를 강제 언래핑하고 a가 nil이면 기본값 b를 반환한다.
- 표현식 a는 항상 옵셔널 타입
- 표현식 b는 a에 저장된 타입과 같아야함.
let defaultColorName = "red"
var userDefinedColorName: String? //nil인 옵셔널 String
var colorNameToUse = userDefinedColorName ?? defaultColorName
//userDefinedColorName이 nil이기 때문에
//colorNameTouse는 deaultColorName("red")를 반환
let defaultColorName2 = "red"
var userDefinedColorName2 = "green" //nil이 아님.
var colorNameToUse2 = userDefinedColorName2 ?? defaultColorName2
//colorNameToUse2 = "green"
a...b a와 b가 포함된 a부터 b까지의 범위 실행을 정의한다.
for index in 1...5 {
//index는 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 b가 포함되지 않은 a부터 b까지의 범위 실행을 정의한다.
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
//i는 0부터 3(count-1)까지
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
배열은 4개의 아이템을 갖고 있지만 0..<count는 반열림 범위이기 때문에
3까지 카운트한다.
a... ...a 연산자가 오직 한쪽의 값만 가지고 있는 경우
for name in names[2...]{
//인덱스 2부터 끝까지
print(name)
}
//Brian
//Jack
for name in names[...2] {
//처음부터 2까지
print(name)
}
//Anna
//Alex
//Brian
for name in names[..<2]{
//처음부터 2 직전까지
print(name)
}
//Anna
//Alex
단-방향 연산자는 컨텍스트에서도 사용 가능하다.
let range = ...5
range.contains(7) //false
range.contains(4) //true
range.contains(-1) //true
부울 로직 값을 true와 false로 수정하거나 결합한다.
- 논리적 NOT
!a- 논리적 AND
a && b- 논리적 OR
a || b
!a 부울 값을 ture->false / false->true 와 같이 반대로 만든다.
논리적 NOT 연산자는 접두사 연산자이며 동작할 값 바로 앞에 공백없이 위치한다.
let allowedEntry = false
if !allowedEntry {
//엔트리가 허락되지 않는다면
//allowedEntry가 false일 경우에만 실행
print("ACCESS DENIED")
}
// 출력 : "ACCESS DENIED"
a && b 두 값이 모두 true여야 true를 표현하는 논리적 표현식을 만든다.
두 값 중 하나라도 false면 결과는 false 이다.
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
//T && F = F
print("Welcome!")
} else {
print("ACCESS DENIED")
}
//출력 : "ACCESS DENIED"
a || b 두 값중 하나라도 true이면 표현식이 true가 되는 논리적 표현식을 만든다.
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
// F || T = T
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
긴 복합 표현식을 생성하기 위해 여러개의 논리적 연산자를 결합할 수 있다.
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
//3개의 작은 표현식이 함께 엮어있는 형태
// F || F || T
// F || T
// T
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 출력 : "Welcome!"
논리적 연산자
&&와||은 왼쪽 우선결합 (left-associative) 이다.
가장 왼쪽부터 판단한다 !
복합 표현식을 읽기 쉽게 하기위해 소괄호를 포함하는 것은 유용하다.
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
// (F) || F || T
// T
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 출력 : "Welcome!"
// 의도를 명확하게 하는데 도움이 되는 곳에 소괄호를 사용해야 합니다.
``