Hashable
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 40번째.
Hashable을 사용하면 값을 Set에 저장하거나 Dictionary 키로 사용할 수 있습니다. 해시는 값에서 계산된 숫자로, 해당 값을 빠르게 찾는 데 사용됩니다. 모든 프로퍼티가 Hashable인 구조체와 열거형은 다음과 같이 준수를 선언하여 이를 얻습니다:
struct Point: Hashable {
let x: Int, y: Int
}
var visited: Set<Point> = []
visited.insert(Point(x: 0, y: 0))
visited.insert(Point(x: 1, y: 0))
visited.insert(Point(x: 0, y: 0))
print(visited.count)
print(visited.contains(Point(x: 1, y: 0)))출력:
2
true해시 가능한 값은 좋은 딕셔너리 키가 되며, 예를 들어 구조화된 값의 발생 횟수를 셀 때 사용할 수 있습니다:
struct Pair: Hashable {
let from: String, to: String
}
let trips = [Pair(from: "A", to: "B"), Pair(from: "B", to: "C"), Pair(from: "A", to: "B")]
var counts: [Pair: Int] = [:]
for t in trips { counts[t, default: 0] += 1 }
print(counts[Pair(from: "A", to: "B")]!)출력:
2Hashable은 Equatable을 기반으로 합니다. ==가 일부 속성만 비교하는 경우 해시에서도 동일한 속성을 사용해야 하며, 이는 hash(into:)에서 수행됩니다. 그렇지 않으면 서로 같은 두 값이 서로 다른 해시를 갖게 되어 집합에 둘 다 저장될 수 있습니다.
struct User: Hashable {
let id: Int
var name: String
static func == (lhs: User, rhs: User) -> Bool { lhs.id == rhs.id }
func hash(into hasher: inout Hasher) { hasher.combine(id) }
}
let users: Set<User> = [User(id: 1, name: "Ada"), User(id: 1, name: "Ada L."), User(id: 2, name: "Bo")]
print(users.count)출력:
2기억해야 할 규칙: 같은 값을 가진 값은 같은 해시를 가져야 합니다. 해시 값은 프로그램 실행마다 바뀌므로 절대 저장하거나 출력하지 마세요. 세트와 딕셔너리를 통해서만 사용하세요.
// 같은 값 -> 같은 해시 (필수)
// 다른 값 -> 보통 다른 해시
func hash(into hasher: inout Hasher) {
hasher.combine(id) // ==가 비교하는 바로 그 속성들
}챌린지
쉬움격자 위의 로봇이 (0, 0)에서 시작하여 한 번에 한 칸씩 U, D, L, R 방향으로 이동합니다. Position(x, y)을 Hashable로 만들고 explore(_:)를 완성하세요. 이 함수는 세 줄을 반환합니다: visited 5 cells(시작 위치를 포함한 서로 다른 위치의 수), revisits 2(이미 방문한 칸에 도착한 이동의 수), 그리고 most visited (0, 0) x3(시작 위치를 한 번 방문한 것으로 세어 가장 많이 방문한 칸. 해당 방문 횟수에 먼저 도달한 칸이 동률을 차지합니다).
제공된 코드는 이동 명령이 담긴 한 줄을 읽고 반환된 각 줄을 출력합니다.
코드는 Position.swift와 Functions.swift에 작성합니다. main.swift에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.
직접 해보기
// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in explore(input[0]) { print(line) }
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드