티스토리 뷰
안녕하세요 :) 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 |
- Xcode
- github
- swift tutorial
- SwiftUI
- Accessibility
- swift3
- Git
- IOS
- actor
- 피아노
- 스위프트 문법
- WKWebView
- 제이슨 파싱
- np-complete
- fastlane
- FLUTTER
- swift delegate
- 회고
- Combine
- iOS delegate
- swift 공부
- Swift
- np-hard
- swift array
- swift sort
- WidgetKit
- UIBezierPath
- 스위프트
- WWDC
- ios 13
- Total
- Today
- Yesterday