Equatable
- 프로토콜
- 값이 동일한지 비교하는 타입
- 클래스, 구조체, enum과 같은 타입이 채택할 수 있습니다.
사용
- Equatable를 채택하여 아래의 코드를 Int 값뿐만 아니라 String, Double, Float에도 다 적용할 수 있습니다.
var some = 1
var other = 2
if some == other {
// code
} else {
// code
}
- 그럼 아래의 코드와 같이 복잡한 클래스나 구조체를 만들어 비교한다면 어떻게 해야 할까요?
class A {
var aNum : Int
init(_ aNum: Int) {
self.aNum = aNum
}
}
if A(1) == A(2) // error
- 위처럼 A(1)와 A(2)가 같은지는 xcode에서 확인할 수 없지만, Equatable을 채택하여 준수하면 비교할 수 있습니다.
// 클래스A는 Equatable을 채택하고 준수함으로써 동일한지 안한지 판별이 가능해짐
class A: Equatable {
var aNum : Int
init(_ aNum: Int) {
self.aNum = aNum
}
}
- 위와 같이 프로토콜을 채택하고 실행하면 Type 'A' does not conform to protocol 'Equatable'이라는 에러가 발생합니다.
- 해당 에러는 클래스 A가 Equtable프로토콜을 준수하고 있지 않다고 알려주는 에러입니다.
- 따라서 Equatable프로토콜에 대한 필수 메서드를 작성하면 이렇게 됩니다.
class A: Equatable {
var aNum : Int
init(_ aNum: Int) {
self.aNum = aNum
}
public static func ==(lhs: Self, rhs: Self) -> Bool {
}
}
- 그럼 또 다른 에러가 발생합니다.
- Self가 A이긴 하지만 파라미터를 안에서 사용하지 못한다는 에러로, 파라미터의 Self를 A로 바꿔주면 됩니다.
class A: Equatable {
var aNum : Int
init(_ aNum: Int) {
self.aNum = aNum
}
public static func ==(lhs: A, rhs: A) -> Bool {
}
}
- 그럼 Missing return in a function expected to return 'Bool'이라는 에러가 나타나는데 에러를 해결하기 위해,
필수 메서드에서 값을 비교하는 리턴 코드를 작성해주겠습니다.
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의 값을 비교 판별해 리턴해주는 코드입니다.
- Equatable을 준수했기 때문에 처음과 다르게 비교가 가능하게 되며, 그 결괏값이 Bool 타입으로 나타납니다.
if A(1) == A(2) {
print("same")
} else {
print("different")
}
// different
- 그리하여 A(1)와 A(2)의 값을 비교해보면 정상적으로 결과가 출력되는 것을 확인할 수 있습니다.
내용 출처
https://zeddios.tistory.com/227
https://developer.apple.com/documentation/swift/equatable
'iOS > iOS' 카테고리의 다른 글
nib (0) | 2022.06.18 |
---|---|
Hashable (0) | 2022.06.16 |
Result타입 (0) | 2022.06.13 |
접근 제어자의 종류 (0) | 2022.06.11 |
NSCache와 NSDictionary의 차이를 설명하시오. (0) | 2022.06.09 |
댓글