Swift operator

최준영·2022년 6월 19일
2

Swift

목록 보기
3/6

swift에서 사용되는 연산자들중 다른어언들과 차이점을 중심으로 작성하였다.

연산자

범위 연산자

var arr1: Array<Int> = [0,1,2,3,4,5];

//Index범위를 지정해 subArr를 만들 수 있다.
print(arr1[0...3]); //[0, 1, 2, 3
//인덱스0부터 6미만가지
print(arr1[0..<6]); //[0, 1, 2, 3, 4, 5]
//인덱스0을 시작으로 끝가지
print(arr1[0...]); //[0, 1, 2, 3, 4, 5]
//제일앞부터 3까지
print(arr1[...3]); //[0, 1, 2, 3]
//제일앞부터 3미만까지
print(arr1[..<3]); //[0, 1, 2]

연산자 우선순위와 결합방향

swift의 연산자들은 우선순위결합방향을 기준으로 연산을 진행한다.

우선순위

swift 연산자의 우선순위는 상대적 순위로 결정된다. 연산자 재정의 부분에서 다루겠다.

결합방향

  • 왼쪽 : ( ( (1 + 2) + 3) + 4)

  • 오른쪽 : (1 + ( 2 + (3 + 4) ) )


연산자 사용자 정의

주의사항

  • 정의가 불가능한 연산자
토큰 (=  ->  //  /*  */  .), 
전위연산자 (<  &  ?)
중위연산자 (?)
후위연산자(>  !  ?)

💡 ' . ' 를 포함한 연산자를 정의할 경우 ' . ' 는 반드시 가장처음에 위치해야합니다.

  • 사용자 정의 연산자는 아래 아스키문자의 결합으로 사용
    | = - + ! * % < > & \ ^ ? ~

전위 연산자 정의

존재하지 않던 연산자 정의

//기존에 없음으로 선언해준다
prefix operator ++;
//함수 형식으로 연산자에 기능을 부여한다. 전위연산자의 대상은 매개변수로 전달된다.
prefix func ++ (value: String) -> String {
    return value + " " + value;
}

var testString: String = "I'm iOS";

print(++testString); //I'm iOS I'm iOS

💡 swift에서는 ++, --연산자는 사용되지 않는다.

기존에 존재하던 연산자에 역할 추가

//기존에 존재하는 연산자는 선언문을 작성하지 않는다.
prefix func ! (value: String) -> Bool {
    return value.isEmpty;
}

var original: Bool = false;

print(!original); //true

var newFunction1: String = "Hello";
var newFunction2: String = "";

print(!newFunction1); //false
print(!newFunction2) //true

🙄만약 기존의 기능과 추가된 기능을 중복하면 어떻게 될까?

prefix func ! (value: Bool) -> String {
    return "newFunction";
}

var test1: Bool = false;

print(!test1) //error: ambiguous use of operator '!'

위와같이 기존의 기능과 구분이 안되 에러가 발생한다.


후위 연산자 정의

postfix operator &*;

postfix func &* (value: Int) -> Int {
    return value * 100;
}

var test: Int = 5;

print( test&* ) //500

중위 연산자 정의

중위 연산자는 위의 두개의 연산자와 달리 우선순위를 명시할 수 있다.

  • 우선순위그룹정의
precedence 새로운우선수위그룹이름 {
    higherThan: 더낮은우선수위그룹
    lowerThan: 더높은우선수위그룹
    associativity: 결합방향(left/right/none)
    assignment: 할당방향 사용(옵셔널 체이닝에서 다룸)
}
  • 사용예시
    💡 중의 연산자는 구현 함수에 func를 쓰지 않는다.
    💡 결합방향이 none이면 연속으로 사용할 수 없다
precedencegroup myPrecedence {
    associativity: left
}

//우선순위를 부여하지 않으면 DefaultPrecedece가 자동부여된다
infix operator &&& : myPrecedence; 

//중위연산자 구현 함수에는 func를 쓰지 않는다.
func &&& (first: String, second: String) -> String {
    first + " | " + second
} 

let result = "1"&&&"2"&&&"3"&&&"4"&&&"5"&&&"6";

print(result);//1 | 2 | 3 | 4 | 5 | 6 
profile
Developer가 되고싶은 꿈나무

0개의 댓글