사용자 지정 동등성 의미
도메인에 맞는 동등성 규칙을 구현합니다.
사용자 지정 동등성 의미은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
기본 ==가 잘못된 경우
합성된 ==은 모든 저장 프로퍼티를 비교합니다. 때로는 이것이 너무 엄격할 수 있습니다. 예를 들어 id만 중요할 수 있습니다. 반대로 너무 느슨할 수도 있습니다. 이런 경우에는 ==을 직접 작성합니다.
식별성 기반 동등성
다른 필드는 무시하고 id가 일치할 때 두 레코드를 같다고 처리합니다.
struct Account: Equatable {
let id: Int
var balance: Int
static func == (l: Account, r: Account) -> Bool { l.id == r.id }
}
print(Account(id: 1, balance: 10) == Account(id: 1, balance: 999)) // true대소문자를 구분하지 않는 동등성
비교하기 전에 값을 정규화합니다.
struct Username: Equatable {
let raw: String
static func == (l: Username, r: Username) -> Bool {
l.raw.lowercased() == r.raw.lowercased()
}
}
print(Username(raw: "Ann") == Username(raw: "ANN")) // trueHashable 일관성 유지하기
==을 사용자 지정하면 같은 필드를 사용하도록 hash(into:)도 반드시 수정해야 합니다. 그렇지 않으면 같은 값이 서로 다른 해시를 생성하여 Set이 올바르게 작동하지 않을 수 있습니다.
일치하는 ==와 hash(into:)
둘 다 id만 사용하여 일관성을 유지합니다.
struct User: Hashable {
let id: Int
var name: String
static func == (l: User, r: User) -> Bool { l.id == r.id }
func hash(into h: inout Hasher) { h.combine(id) }
}
print(Set([User(id: 1, name: "A"), User(id: 1, name: "B")]).count) // 1캐시를 무시하는 동등성
파생되거나 캐시된 필드는 비교에서 제외합니다.
struct Doc: Equatable {
let text: String
var cachedWordCount: Int
static func == (l: Doc, r: Doc) -> Bool { l.text == r.text }
}
let a = Doc(text: "hi", cachedWordCount: 1)
let b = Doc(text: "hi", cachedWordCount: 999)
print(a == b) // true허용 오차를 사용하는 부동소수점 동등성
double 값을 정확히 비교하는 대신 엡실론 범위 안에 있는지 비교합니다.
struct Measure: Equatable {
let value: Double
static func == (l: Measure, r: Measure) -> Bool {
abs(l.value - r.value) < 0.0001
}
}
print(Measure(value: 0.1 + 0.2) == Measure(value: 0.3)) // true필드 일부만 비교하기
도메인에서의 동등성을 위해 의미 있는 필드 일부만 비교합니다.
struct Card: Equatable {
let rank: Int
let suit: String
let isFaceUp: Bool // display state, not identity
static func == (l: Card, r: Card) -> Bool {
l.rank == r.rank && l.suit == r.suit
}
}
print(Card(rank: 1, suit: "H", isFaceUp: true) == Card(rank: 1, suit: "H", isFaceUp: false)) // trueEquatable의 규칙 지키기
사용자 지정 ==은 반사성(a == a), 대칭성(a == b이면 b == a), 추이성을 유지해야 합니다. 이를 위반하면 컬렉션과 알고리즘이 혼란스러운 결과를 냅니다.
대칭적인 구현
정규화된 형식을 비교하면 대칭성이 유지됩니다.
struct Email: Equatable {
let address: String
static func == (l: Email, r: Email) -> Bool {
l.address.lowercased() == r.address.lowercased()
}
}
let x = Email(address: "A@x.com")
let y = Email(address: "a@X.com")
print(x == y, y == x) // true trueSet에서 사용자 지정 동등성 사용하기
id만 사용하는 동등성 비교와 해싱이 일치하므로, Set은 id가 같은 값을 하나의 값으로 처리합니다.
struct Item: Hashable {
let id: Int
var note: String
static func == (l: Item, r: Item) -> Bool { l.id == r.id }
func hash(into h: inout Hasher) { h.combine(id) }
}
let s: Set<Item> = [Item(id: 1, note: "x"), Item(id: 1, note: "y")]
print(s.count) // 1빠른 확인
일부 필드만 사용하는 사용자 지정 ==을 작성했다면 무엇을 추가로 해야 하나요?
복습
사용자 지정 동등성에 대해 다음을 배웠습니다.
- 기본 전체 구조체 비교가 적절하지 않을 때 직접
==을 작성합니다. - 일반적인 경우로 id만 비교하기, 대소문자를 구분하지 않고 비교하기, 엡실론을 사용하는 부동소수점 비교, 캐시 무시하기가 있습니다.
- 같은 필드를 사용하도록
hash(into:)의 일관성을 유지해야 합니다. - 반사성, 대칭성, 추이성을 유지해야 합니다.
과정을 완료했습니다! 다음 주제: CustomStringConvertible과 Mirror
자주 묻는 질문
“사용자 지정 동등성 의미” 강의는 무료인가요?
네 — “사용자 지정 동등성 의미” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“사용자 지정 동등성 의미”에서 뭘 배우나요?
도메인에 맞는 동등성 규칙을 구현합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“사용자 지정 동등성 의미” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 자동 생성되는 Equatable
- Hashable과 hash(into:)
- Comparable과 정렬
- 사용자 지정 동등성 의미