Equatable에 대해 알아봅시다!

som·2023년 12월 19일
0

SwiftAnatomy

목록 보기
5/9

저번에 예고한 대로 Equatable, Hashable, Sendable을 다뤄보려고 합니다.

그 첫번째 포스트! Equatable입니다~

개념

해당 코드는 swift > stdlib > public > core > Equatable.swift에서 볼 수 있습니다!

public protocol Equatable {
  /// Returns a Boolean value indicating whether two values are equal.
  ///
  /// Equality is the inverse of inequality. For any values `a` and `b`,
  /// `a == b` implies that `a != b` is `false`.
  ///
  /// - Parameters:
  ///   - lhs: A value to compare.
  ///   - rhs: Another value to compare.
  static func == (lhs: Self, rhs: Self) -> Bool
}

값 동등성을 비교할 수 있는 타입입니다.Equatable 프로토콜을 준수하는 타입은 같음 연산자(==)를 사용하여 같은지 비교하거나 같지 않음 연산자(!=)를 사용하여 같지 않은지 비교할 수 있습니다. Swift 표준 라이브러리의 대부분의 기본 유형은 Equatable을 따릅니다.

일부 시퀀스 및 컬렉션 작업은 요소가 Equatable을 준수하는 경우 더 간단하게 사용할 수 있습니다. 예를 들어, 배열에 특정 값이 포함되어 있는지 확인하려면 동등성을 결정하는 클로저를 제공하는 대신 배열의 요소가 Equatable을 준수할 때 값 자체를 contains(_:) 메서드에 전달할 수 있습니다.

Equatable은 동일한 값인지 비교해주는 프로토콜입니다. 내부 메서드인 ==로 매개변수로 들어온 값이 서로 같은 지의 여부를 Bool 타입으로 반환합니다.

사용자 정의 타입에 Equatable 적합성을 추가하면 컬렉션에서 특정 인스턴스를 검색할 때 더 편리한 API를 사용할 수 있습니다. EquatableHashableComparable 프로토콜의 기본 프로토콜이기도 하며, 이를 통해 세트 구성이나 컬렉션 요소 정렬과 같은 사용자 정의 타입을 더 많이 사용할 수 있습니다.

타입의 원래 선언에서 Equatable 적합성을 선언하고 유형이 다음 기준을 충족하는 경우 사용자 정의 타입에 대한 Equatable 프로토콜 요구 사항의 자동 합성에 의존할 수 있습니다.

  • struct의 경우 모든 저장 프로퍼티는 Equatable을 준수해야 합니다.
  • enum의 경우 연관된 모든 값은 Equatable을 준수해야 합니다. (관련 값이 없는 enum은 선언 없이도 Equatable 적합성을 갖습니다.)

ㅇ0ㅇ! 생각보다 Equatable은 많은 타입에서 준수하고 있었군요!

타입의 Equatable 적합성을 맞춤설정하려면, 위에 나열된 기준을 충족하지 않는 타입에서 Equatable을 채택하거나, Equatable을 따르도록 기존 타입을 확장하려면 같음 연산자(==)를 해당 타입의 정적 메서드로 사용합니다. 표준 라이브러리는 사용자 정의 == 함수를 호출하고 그 결과를 부정하는 Equatable 타입에 대해 같지 않음 연산자(!=)에 대한 구현을 제공합니다.

extension Equatable {
  /// Returns a Boolean value indicating whether two values are not equal.
  ///
  /// Inequality is the inverse of equality. For any values `a` and `b`, `a != b`
  /// implies that `a == b` is `false`.
  ///
  /// This is the default implementation of the not-equal-to operator (`!=`)
  /// for any type that conforms to `Equatable`.
  ///
  /// - Parameters:
  ///   - lhs: A value to compare.
  ///   - rhs: Another value to compare.
  // transparent because sometimes types that use this generate compile-time
  // warnings, e.g. that an expression always evaluates to true

  @_transparent
  public static func != (lhs: Self, rhs: Self) -> Bool {
    return !(lhs == rhs)
  }
}
  • @_transparent
    이 어트리뷰트는 옵셔널에서도 한 번 공부했었죠?
    @_transparent이 명시된 함수는 수정이 되어서는 안 된다는 제약이 있고, 구현 시 비공개 항목(진정 비공개 함수 또는 다음 릴리스에서 사라질 수 있는 내부 함수)이 사용되는 것도 권장하지 않습니다. 즉, public 또는 @usableFromInline된 코드만 권장하고 있습니다.

확장된 Equatable에는 기존 내부 메서드와 다르게 != 메서드가 있습니다. 이 메서드는 두 인스턴스가 서로 다른 ID를 가지고 있는지 여부를 테스트합니다. 상황에 따라 ==!=를 적절히 활용하면 되겠네요!

간단 정리

이번 포스트는 Equatable에 대해서 다루어 보았습니다.

Equatable은 값 동등성을 비교할 수 있는 타입입니다.Equatable 프로토콜을 준수하는 타입은 같음 연산자(==)를 사용하여 같은지 비교하거나 같지 않음 연산자(!=)를 사용하여 같지 않은지 비교할 수 있습니다. Swift 표준 라이브러리의 대부분의 기본 유형은 Equatable을 따릅니다.

다음 포스트에서 뵈어요~!

profile
얼레벌레 취준 공부 중인 초보 개발자

0개의 댓글