스위프트의 연산자는 특정한 문자로 표현한 함수
분류 | 설명 | 예 |
---|---|---|
단항 연산자 | 피연산자가 한 개 | !A |
이항 연산자 | 피연산자가 두 개 | A+B |
삼항 연산자 | 피연산자가 세 개 | A?B:C |
전위 연산자 | 연산자가 피연산자 앞에 위치 | !A |
중위 연산자 | 연산자가 피연산자 사이에 위치 | A+B |
후위 연산자 | 연산자가 피연산자 뒤에 위치 | A! |
분류 | 부호 | 설명 |
---|---|---|
할당 연산자 | A=B | A에 B의 값을 할당, 다른 데이터 타입이면 오류 발생 |
연산자 | 부호 |
---|---|
덧셈 연산자 | A+B |
뺴기 연산자 | A-B |
곱셈 연산자 | A*B |
나누기 연산자 | A/B |
나머지 연산자 | A%B |
Double.truncatingRemainder(divider: Double)
연산자 | 부호 | 설명 |
---|---|---|
값이 같다. | A==B | A와 B가 같은지 Bool값 반환 |
값이 크거나 같다. | A>=B | A가 B보다 크거나 같은 값인지 Bool값 반환 |
값이 작거나 같다. | A<=B | A가 B보다 작거나 같은 값인지 Bool값 반환 |
값이 크다. | A>B | A가 B보다 큰 값인지 Bool값 반환 |
값이 작다. | A<B | A가 B보다 작은 값인지 Bool값 반환 |
값이 같지 않다. | A!=B | A와 B가 다른 값인지 Bool값 반환 |
참조가 같다. | A===B | A와 B가 참조 타입일 때 같은 인스턴스를 가르키는지 비교하여 Bool값 반환 |
참조가 같지 않다. | A!==B | A와 B가 참조 타입일 때 다른 인스턴스를 가르키는지 비교하여 Bool값 반환 |
패턴 매치 | A~=B | A와 B의 패턴이 매치되는지 확인하여 Bool값을 반환 |
어떤 범위에 값이 속하는지 불리언 값으로 알려주는 연산자
{Range 값} ~= {하나의 값}
이런 식으로 활용할 수 있네요!
연산자 | 부호 | 설명 |
---|---|---|
삼항 조건 연산자 | Question? A:B | Question(Bool)값이 참이면 A, 거짓이면 B를 반환 |
연산자 | 부호 | 설명 |
---|---|---|
폐쇄 범위 연산자 | A...B | A부터 B까지의 수를 묶어 범위를 표현합니다. A와 B를 포함합니다. |
반폐쇄 범위 연산자 | A..<B | A부터 B미만까지의 수를 묶어 범위를 표현합니다. A를 포함하고 B를 포함하지 않습니다 |
단방향 범위 연산자 | A... ...A ..<A | A 이상의 수를 묶어 범위를 포함합니다. A 이하의 수를 묶어 범위를 표현합니다. A 미만의 수를 묶어 범위를 표현합니다. |
연산자 | 부호 | 설명 |
---|---|---|
NOT(부정) 부울 연산자 | !B | B 값의 참, 거짓을 반전합니다. |
AND 부울 연산자 | A && B | A와 B의 불리언 AND 논리 연산을 실행합니다. |
OR 부울 연산자 | A || B | A와 B의 불리언 OR 논리 연산을 실행합니다. |
연산자 | 부호 | 설명 |
---|---|---|
NOT(부정) 비트 연산자 | ~A | A의 비트를 반전한 결과를 반환합니다. |
AND 비트 연산자 | A & B | A와 B의 비트 AND 비트 논리 연산을 실행합니다. |
OR 비트 연산자 | A | B |
XOR 부울 연산자 | A ^ B | A와 B의 비트 XOR 논리 연산을 실행합니다. |
비트 이동 연산자 | A >> B A << B | A의 비트를 B만큼 시프트(이동)합니다. |
복합 할당 연산자로 표현 | |
---|---|
A = A + B | A += B |
A = A - B | A -= B |
A = A*B | A *= B |
A = A/B | A /= B |
A = A % B | A %= B |
A = A << B | A <<= B |
A = A >> B | A >>= B |
A = A && B | A &= B |
A = A || B | A |= B |
A = A ^^ B | A ^= B |
스위프트는 기본 연산자를 통해 오버플로에 대비할 수 있도록 해놓았다. 오버플로 연산자를 사용하면 오버플로를 자동으로 처리한다.
부호 | 설명 |
---|---|
&+ | 오버플로에 대비한 덧셈 연산을 합니다. |
&- | 오버플로에 대비한 뺄셈 연산을 합니다. |
&* | 오버플로에 대비한 곱셈 연산을 합니다. |
부호가 없는 양의 정수만 표현하는 UInt8 타입에 뺄셈을 했더니 런타임 에러가 발생하네요.
그럼 이렇게 오버플로우 연산자를 사용하면 됩니다!
연산자 | 부호 | 설명 |
---|---|---|
nil 병합 연산자 | A ?? B | A가 nil이 아니면 A를 반환, A가 nil이면 B를 반환 |
부호변경 연산자 | -A | A의 부호를 변경 |
옵셔널 강제 추출 연산자 | O! | 옵셔널 개체 O의 값을 강제로 추출 |
옵셔널 연산자 | V? | 옵셔널 값 V를 안전하게 추출하거나, 데이터 타입 V가 옵셔널임을 표현 |
옵셔널 강제 추출 연산자는 지양하는 편이 좋습니다.
우선순위가 높은 연산자가 자신에 비해 우선순위가 낮은 연산자보다 먼저 실행됩니다. 스위프트의 연산자의 연산자 우선순위는 절대치가 아닌 상대적 수치입니다.
연산자가 연산하는 결합방향도 지정되어 있습니다. 결합 방향이 같은 우선순위에 있는 연산자끼리 나열됐을 때 어느 방향부터 그룹 지을 것인지 나타냅니다.
예를 들어 1+2+3+4라는 수식이 있다면 +의 연산 방향은 왼쪽이기 때문에 ((1+2)+3)+4)처럼 연산이 됩니다.
precedencegroup BitwiseShiftPrecedence {
higherThan: MultiplicationPrecedence
}
precedencegroup FunctionArrowPrecedence {
associativity: right
higherThan: AssignmentPrecedence
}
precedencegroup TernaryPrecedence {
associativity: right
higherThan: FunctionArrowPrecedence
}
precedencegroup DefaultPrecedence {
higherThan: TernaryPrecedence
}
precedencegroup LogicalDisjunctionPrecedence {
associativity: left
higherThan: TernaryPrecedence
}
precedencegroup LogicalConjunctionPrecedence {
associativity: left
higherThan: LogicalDisjunctionPrecedence
}
precedencegroup ComparisonPrecedence {
higherThan: LogicalConjunctionPrecedence
}
precedencegroup NilCoalescingPrecedence {
associativity: right
higherThan: ComparisonPrecedence
}
precedencegroup AdditionPrecedence {
associativity: left
higherThan: RangeFormationPrecedence
}
precedencegroup CastingPrecedence {
higherThan: NilCoalescingPrecedence
precedencegroup AssignmentPrecedence {
associativity: right
assignment: true
}
precedencegroup RangeFormatPrecedence {
higherThan: CastingPrecedence
}