Sobes.tech
Junior

Ի՞նչ պետք է անել, որպեսզի օգտագործողի կառուցվածքը կամ դասը դառնա բառարանի բանալի։

sobes.tech AI

Պատասխան AI-ից

Կառուցվածքներն ու դասերը պետք է լինեն հեշավորվող: Եթե կառուցվածքը կամ դասը պարունակում է միայն հեշավորվող տիպեր (օրինակ, Int, String, Bool), ապա կոմպիլյատորը ավտոմատ կերպով կստեղծի Hashable պրոտոկոլի իրականացմանը: Եթե կառուցվածքը կամ դասը պարունակում է ոչ-հեշավորվող տիպեր կամ պահանջում է հատուկ հեշավորման լոգիկա, ապա անհրաժեշտ է.

  1. Իրականացնել Hashable պրոտոկոլը:
  2. Մեթոդում 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, կամ պահանջվում է հատուկ համեմատության լոգիկա, անհրաժեշտ է ձեռքով իրականացնել ==-ը։