티스토리 뷰

Swift

Swift ) Equatable

Zedd0202 2017. 9. 18. 17:35
반응형

안녕하세요 :) Zedd입니다.

오늘은 Swift의 Equatable에 대해서 알아볼거에요 XD

저도 처음들어본답니다...


다음글에서 Equatable이 나오는데 Equatable을 모르시는 분들을 위해(+나) 정리해보려고 해요 :)

시작할게요!!




Swift ) Equatable




이름에서 살짝? 유추할 수 있죠?  뭔가 같거나, 동일하거나 뭐 이런뜻 이네요.

뭘 동일시한다는 걸까요?

먼저 모르는게 생기면...애플문서....Equatable에 대해 정리해놓은 것을 봅시다.



먼저 가장 눈에 띄는 점은 Equatable은 프로토콜이네요!

Equatable이라는 약속이 있는것이죠. Equatable채택하는 어떤것?은 이 약속을 지켜야겠죠?


그리고 Equatable의 정의를 볼까요?


A type that can be compared for value equality.

값이 동일한 지 어떤지를 비교 할 수있는 타입



아하 값이 동일한지 어떤지를 비교 할 수 있는 타입이래요.


이게 어떤 의미인지 설명해드릴게요.


Equatable 프로토콜을 준수하는 타입은 등호 연산자 (==) 또는 같지 않음 연산자 (!=)를 사용하여 동등성을 비교할 수 있습니다.

Swift 표준 라이브러리의 대부분 기본 데이터타입은 Equatable를 따릅니다.


아하 Equatable 프로토콜은 어떤 "타입"이 채택할 수 있나보네요. 타입에는 클래스, 구조체, enum 등이 있겠네요. 


Double, Bool 등 다른 기본적인 데이터타입도 Equatable을 따르고 있어요.

우리는 코딩을 하면서 얘네가 얘네가 같은지 체크하곤 했죠? 


var some = 1

var other = 2

if some == other{

    //code

}

else{

    //code

}


위 코드는 Int지만, String에도, Double에도, Bool에도, Float에도 다 적용이 되죠?

이게 가능한 이유는

이 타입 모두가 Equatable이라는 프로토콜을 따르고 있기 때문이에요.

그래서 얘네가 똑같냐? 아니냐?를 확인할 수 있는것이죠.


만약에 우리가 아주아주 복잡한 클래스나 구조체를 만들었어요. 얘네도 하나의 타입이죠?

우리가 이 클래스/구조체의 인스턴스끼리 비교를 하고싶어요.

이 인스턴스랑 이 인스턴스랑 같니?

그럼 얘네가 같은지;;안같은지;; Xcode는 모른답니다.

하나의 예제를 볼까요?


class A{

    var aNum : Int

    init(_ aNum :Int) {

        self.aNum = aNum

    }

}


if A(1) == A(2) //error!

{


}


위 코드가 이해가 가시나요?

Xcode는 A(1)과 A(2)가  같은지 몰라요.

A(1).aNum == A(2).aNum이 같은지 안같은지는 알겠지만요. (A(1).aNum, A(2).aNum은 Int이기 때문에-> Int는 Equatable을 따르고 있기 때문에 같은지 안같은지 비교가 가능하죠.)


아 근데 나는 죽어도 A(1) == A(2)이렇게 비교를 해야겠다! 하시는 분들은

이때, Equatable이 필요한 것입니다. 

클래스 A는 Equatable을 채택하고 준수함으로서 동일한지 동일하지 않은지 판별이 가능해지는 것이죠.

한번 해볼까요?


먼저 Equatable 채택해야겠죠? 


class A : Equatable {

    var aNum : Int

    init(_ aNum :Int) {

        self.aNum = aNum

    }

}

클래스 A가 Equatable프로토콜을 채택했습니다.

하지만 우리는 에러를 볼 수 있어요.



클래스 A는 Equatable프로토콜을 준수하고 있지 않기 때문이죠.

어 뭔가 테이블뷰/콜렉션뷰에서도 비슷한 에러를 본 적있죠?

뭔가 Optional이 아닌 메소드가 있나보네요. Equatable 프로토콜로 가봅시다. 


역시나 Optional이 아니네요.

그럼 구현을 해줘야겠죠? 

클래스 A에 저 메소드를 복붙해줍시다. 

그러면 

너 지금 Equatable프로토콜을 준수하고 있지 않아..! 라는 에러는 없어졌지만,


Self가 아니라 A인 것 같은데? 라는 에러가 나옵니다. 

Self가 A이긴 하지만, 파라미터 안에서는 못쓰나 보네요. 

A로 바꿔줍시다.

그러면



리턴값이 없다는 에러가 나오게 됩니다. 

이 메소드 안에서 우리는 값을 비교해줘야겠네요!!


class A : Equatable{

    var aNum : Int

    init(_ aNum :Int) {

        self.aNum = aNum

    }

    public static func ==(lhs: A, rhs: A) -> Bool{

        return lhs.aNum == rhs.aNum

    }

}

클래스 A의 프로퍼티인 aNum이 같은지 안같은지 판별해서 리턴해줍시다.

다시한번 말씀드리지만, aNum은 Int타입이죠? Equatable을 준수하기 때문에 당연히 비교가 가능하고, 결과는 Bool값으로 나오게 됩니다. 



자, 그럼 우리가 원하는 

if A(1) == A(2){

    print("same")

}else{

    print("different")

}


위 코드는 잘 실행될 것이냐~~



다르다고 나오네요!!!


어떠신가요? Swift의 Equatable에 대해 조금은 아시겠나요? 

궁금한 점이나, 지적할 점이 있다면 댓글이나 PC화면 오른쪽 하단에 있는 채널서비스를 이용해주세요 :)

이 글이 도움이 되었으면 좋겠어요 🙏




반응형

'Swift' 카테고리의 다른 글

함수(Function) VS 메소드(Method)  (3) 2017.09.26
Swift ) Generic  (7) 2017.09.22
Swift ) 크기가 정해진 2차원 배열 만들기  (0) 2017.09.18
Swift ) 랜덤함수 차이  (0) 2017.09.11
Swift ) Any와 AnyObject의 차이  (1) 2017.09.10