저번에 예고한 대로 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를 사용할 수 있습니다.Equatable
은Hashable
및Comparable
프로토콜의 기본 프로토콜이기도 하며, 이를 통해 세트 구성이나 컬렉션 요소 정렬과 같은 사용자 정의 타입을 더 많이 사용할 수 있습니다.타입의 원래 선언에서
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
을 따릅니다.
다음 포스트에서 뵈어요~!