Swift : Protocol Equatable

Wooyo·2023년 8월 30일
0
post-thumbnail

참고 블로그 : https://babbab2.tistory.com/148

Equatable

개념

  • Int, String 끼리는 비교가 되면서 구조체 / 클래스 인스턴스끼리는 일반적으로 비교를 할 수 없는데, 비교를 할 수 있도록 하는 프로토콜.

  • 위와 같은 자료형은 기본적으로 Equatable 프로토콜이 채택되어 있어 자동으로 구현된다.

    
    struct Human {
        var name = ""
        var age = 0
    }
    
    let human1 = Human.init()
    let human2 = Human.init()
    
    human1 == human2
    
  • 위와 같은 코드 작성시 다음의 에러가 발생

    //Binary operator '==' cannot be applied to two 'Human' operands
    
  • 따라서 비교연산 (==)을 하기 위해서는 필수적 구현해야하는 프로토콜

구조체에서의 Equatable

struct Human: Equatable {
    var name = ""
    var age = 0
}

let human1 = Human.init()
let human2 = Human.init(name: "", age: 19)

human1 == human2        // false
  • Equatable 프로토콜을 채택함으로써 비교가 가능해짐
  • 이름과 나이 둘중 하나의 부분이 같으면 인스턴스로 채택하고 싶다고 한다면 다음과 같이 내부에 Equatable 프로토콜 == 함수를 구현해주어야한다.
  • 나이로 예를 들면
    struct Human: Equatable {
        var name = ""
        var age = 0
    
        static func == (lhs: Self, rhs: Self) -> Bool {
            return lhs.age == rhs.age
        	}
        }
    et human1 = Human.init()
    let human2 = Human.init(name: "", age: 19)
    human1 == human2        // false

클래스에서의 Equatable

class Human {
    var name = ""
    var age = 0
}
 
extension Human: Equatable {
    static func == (lhs: Human, rhs: Human) -> Bool {
        return lhs.name == rhs.name && lhs.age == rhs.age
    }
}
 
let human1 = Human.init()
let human2 = Human.init()
human2.age = 10
 
human1 == human2        // false
  • 클래스의 경우 Equatable을 채택하면 자동으로 구현되지 않고 === 메서드를 구현해야한다.

열거형

  • 일반열거형의 경우 Equatable 프로토콜을 채택하지 않아도 자동구현
enum Gender {
    case male
}
 
let man = Gender.male
let man2 = Gender.male
 
man == man2   // true
  • 연관값이 있는 열거형의 경우 Equatable을 채택하여야 구현가능
enum Gender: Equatable {
    case male(name: String)
}
 
let man = Gender.male(name: "so")
let man2 = Gender.male(name: "deul")
 
man == man2   // false
profile
Wooyo의 개발 블로그

0개의 댓글