Sobes.tech
Junior

İstifadəçi quruluşu və ya sinfi lüğətdə açar olması üçün nə etmək lazımdır?

sobes.tech Süni İntellekt

AI-dan cavab

Strukturlar və ya sinflər hashlenebilir olmalıdır. Yalnız hashlenebilir tipləri (məsələn, Int, String, Bool) ehtiva edən struktur və ya sinf üçün tərtibçi avtomatik olaraq Hashable protokolunun tətbiqini yaradır. Əgər struktur və ya sinf hashlenməyən tipləri ehtiva edirsə və ya xüsusi hash-ləmə məntiqi tələb olunursa:

  1. Hashable protokolunu tətbiq etmək lazımdır.
  2. hash(into:) metodunda, nümunənin hash-lənə bilən komponentləri təqdim olunan hashera əlavə edilməlidir.
struct User: Hashable {
    let id: UUID // UUID standart olaraq Hashable
    let name: String // String standart olaraq Hashable

    // Əgər bütün xüsusiyyətlər Hashable-dirsə, avtomatik olaraq yaradılır
    // 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
    }

    // Sinf üçün əl ilə tətbiq
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Həmçinin, `Equatable` tətbiqi də tələb olunur
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

// İstifadə nümunəsi
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]

Həmçinin, Hashable Equatable-dən irs aldığı üçün, Equatable protokolunu da tətbiq etmək lazımdır. Kompilyator, xüsusiyyətləri də Equatable olan strukturlar üçün Equatable-in avtomatik tətbiqini yaradır. Equatable olmayan xüsusiyyətləri olan sinflər və ya strukturlar (və ya xüsusi müqayisə məntiqi üçün) üçün ==-in əl ilə tətbiqi tələb olunur.