Hashable && Equatable

준우·2024년 1월 30일
0

Swift 이야기

목록 보기
5/19
post-thumbnail

스위프트 Hashable && Equatable

  • 객체의 동등성과 해시 가능성을 처리하는 데 사용

Equatable

  • 두 객체가 동등한지 비교할 수 있게 해줍니다. 클래스, 구조체, 열거형이 Equatable 을 준수하면, 이들의 인스턴스를 '==' 연산자를 사용하여 비교할 수 있습니다.

  • 두 객체가 같은 값이나 상태를 갖는지 확인하는 데 사용합니다.

  • 예시코드

// Equatable
struct Person {
    let name: String
}

struct Car: Equatable {
  	// 객체를 비교하는 메서드
    static func == (lhs: Car, rhs: Car) -> Bool {
        return lhs.make == rhs.make && lhs.model == rhs.model && lhs.owner.name.lowercased() == rhs.owner.name.lowercased()
    }
    
    let make: String
    let model: String
    let owner: Person
}

let bmw = Car(make: "bmw", model: "5 series", owner: Person(name: "joe"))
let benz = Car(make: "M-benz", model: "E Class", owner: Person(name: "Afraz"))

if bmw == benz {
    print("Same")
} else {
    print("Different")
}

Hashable

  • 객체를 해시할 수 있게 해주며, 이는 주로 해시 테이블 기반의 자료구조에서 객체를 효율적으로 저장하고 검색하는데 사용됩니다.
  • Hashable 은 Equatable 을 상속하므로, Hashable 프로토콜을 준수하는 타입은 동등성 비교도 구현해야 합니다.
  • Hashable 프로토콜을 준수하는 타입은 hash(into:) 메서드를 구현하여 객체의 해시 값을 제공해야 합니다.
  • 예시코드
// Hashable
struct  PersonHash {
    let name: String
}

struct UserAccount: Hashable {
    
    let accountIdentifier: PersonHash
    
  	// 객체의 해시 값 제공 메서드
    func hash(into hasher: inout Hasher) {
        hasher.combine(accountIdentifier.name)
    }
    
  	// Equatable 을 상속하므로, 동등성 구현
    static func == (lhs: UserAccount, rhs: UserAccount) -> Bool {
        return lhs.accountIdentifier.name == rhs.accountIdentifier.name
    }
    
}

struct Post {
    let text: String
}

var dictionary = [
    UserAccount(accountIdentifier: PersonHash(name: "a")): [
        Post(text: "first")
    ],
    UserAccount(accountIdentifier: PersonHash(name: "b")): [
        Post(text: "second")
    ]
]

if let posts = dictionary[UserAccount(accountIdentifier: PersonHash(name: "a"))] {
    print(posts)    
}

결론

  • Equatable 은 두 객체가 같은 값이나 상태를 갖는지 확인하는데 사용
  • Hashable 은 객체를 해시 테이블에 저장하거나 검색할 때 사용
  • Hashable 은 Equatable 의 요구 사항을 포함하므로, Hashable 을 준수하는 모든 타입은 자동으로 Equatable 도 준수함.

0개의 댓글