Equatable

Minseok, Kim·2021년 7월 3일
0

요약

Equatable Protocol을 적용하여 Custom Type끼리의 비교가 가능하다

기본 개념

A type that can be compared for value equality.
값이 동일한지 비교할 수 있는 Type

Swift 공식 문서에 정의되어있는 Equatable의 개념이다.

Swift 기본 Type들은 대부분 Equatable을 따른다.
Equatable을 따르는 Type들은 같다(==)와 같지 않다(!=) 연산자를 사용할 수 있다.
아래 코드와 같이 말이다.

var c1 = "ABC"
var c2 = "ABC"
var c3 = "XZY"

print(c1 == c2 ? true : false)
// true

print(c1 != c2 ? true : false)
// false

print(c2 == c3 ? true: false)
// false

활용

기본적으로 Swift에서 Class, Structure, Enum과 같은 CustomType은 서로 비교 불가하다.

class StreetAddress {
    let number: String
    let street: String

    init(_ number: String, _ street: String) {
        self.number = number
        self.street = street
    }
}

print(StreetAddress("1", "A") == StreetAddress("1", "A") ? true : false)
//Error: binary operator '==' cannot be applied to two 'StreetAddress' operands

다음과 같이 StreetAddress에 대하여 == 연산자 적용이 불가능하다는 Error가 뜬다.

하지만 이러한 상황에서 Class, Structure, Enum등을 비교하고 싶을 경우, Equatable을 사용하면 된다.

Equatable은 Protocol이다.
위에서 말했듯이 Equatable을 따르는 Type들은 서로 같은지 비교할 수 있다.
한마디로 Equatable을 적용할 경우 Class, Structure, Enum 등을 비교할 수 있다.

class StreetAddress: Equatable {
    static func == (lhs: StreetAddress, rhs: StreetAddress) -> Bool {
        return
            lhs.number == rhs.number &&
            lhs.street == rhs.street
    }
    
    let number: String
    let street: String

    init(_ number: String, _ street: String) {
        self.number = number
        self.street = street
    }
}

print(StreetAddress("1", "A") == StreetAddress("1", "A") ? true : false)
// true
print(StreetAddress("1", "A") != StreetAddress("1", "A") ? true : false)
// false
print(StreetAddress("1", "A") == StreetAddress("2", "B") ? true : false)
// false

Euatable을 적용하고 해당 프로토콜에서 요구하는 static func == (lhs: Self, rhs: Self) -> Bool 을 작성했더니 StreetAddress Class끼리 비교가 가능해졌다.
static func == (lhs: Self, rhs: Self) -> Bool 내부에는 비교할 Type의 모든 Property들이 같은지 확인하여 반환하면 된다.

profile
iOS, Swift Dev

0개의 댓글