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