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 нестанд (ё барои логикаи муқоисаҳои махсус), иҷрои дастӣ == зарур аст.