Junior
Ի՞նչ պետք է անել, որպեսզի օգտագործողի կառուցվածքը կամ դասը դառնա բառարանի բանալի։
sobes.tech AI
Պատասխան AI-ից
Կառուցվածքներն ու դասերը պետք է լինեն հեշավորվող: Եթե կառուցվածքը կամ դասը պարունակում է միայն հեշավորվող տիպեր (օրինակ, Int, String, Bool), ապա կոմպիլյատորը ավտոմատ կերպով կստեղծի Hashable պրոտոկոլի իրականացմանը: Եթե կառուցվածքը կամ դասը պարունակում է ոչ-հեշավորվող տիպեր կամ պահանջում է հատուկ հեշավորման լոգիկա, ապա անհրաժեշտ է.
- Իրականացնել
Hashableպրոտոկոլը: - Մեթոդում
hash(into:), տրամադրված հեշերին ավելացնել կառուցվածքի հեշավորվող բաղադրիչները:
struct User: Hashable {
let id: UUID // UUID-ն ըստ նախնական է Hashable
let name: String // String-ը ըստ նախնական է Hashable
// Ավտոմատորեն ստեղծվում է, եթե բոլոր հատկությունները Hashable են
// func hash(into hasher: inout Hasher) {
// hasher.combine(id)
// hasher.combine(name)
// }
}
class Settings: Hashable {
var difficulty: Int
var volume: Float
init(difficulty: Int, volume: Float) {
self.difficulty = difficulty
self.volume = volume
}
// Ձեռքով իրականացում դասի համար
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// Անհրաժեշտ է նաև իրականացնել `Equatable`
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Օրինակ օգտագործում
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
Նույնպես անհրաժեշտ է իրականացնել Equatable պրոտոկոլը, քանի որ Hashable ժառանգում է նրանից: Կոմպիլյատորը ավտոմատ կերպով ստեղծում է Equatable-ի իրականացումը այն կառուցվածքների համար, որոնց հատկությունները նույնպես Equatable են: Կան դասեր կամ կառուցվածքներ, որոնց հատկությունները չեն Equatable, կամ պահանջվում է հատուկ համեմատության լոգիկա, անհրաժեշտ է ձեռքով իրականացնել ==-ը։