Middle+
Навъи ҳамбастаи (associated type) чист?
sobes.tech AI
Ҷавоб аз AI
Тавсифи намуд (associated type) як ҷойгузин (мавқеъи ном) барои намудест, ки дар ҳақиқат дар протокол истифода мешавад. Ин нишон медиҳад, ки протокол талаб мекунад, ки намуд муайян мавҷуд бошад, аммо онро ба таври ошкоро муайян намекунад, то он ки протокол аз ҷониби намудҳои мушаххас қабул карда шавад ё дар васеъкунии он.
Манфиатҳо:
- Либералӣ: Имкон медиҳад, ки протоколҳо боқӣ монанд, бо ҳар намуде, ки талаботҳои намудҳои тавсифшударо қонеъ мекунад, кор кунанд.
- Тафтиши қавии намуд: Компилятор дар вақти компиляция намоён медонад, ки намуд чӣ гуна аст, ки хатогиҳоро пешгирӣ мекунад ва бехатарии намудҳоро таъмин мекунад.
- Беҳтар кардани хонданпазирӣ: Протокол ба таври ошкор намудҳои додаҳоро эълон мекунад, ки онро бештар пешгӯишаванда мекунад.
Ин бо калимаи калидии associatedtype эълон карда мешавад.
Масалан:
protocol Container {
associatedtype Item // Намуди тавсифшуда Item
var items: [Item] { get set }
mutating func append(_ item: Item)
}
struct IntContainer: Container {
// Тавсифи ошкор аз намуди Item (ихтиёрӣ, Swift метавонад онро фаҳмад)
typealias Item = Int
var items: [Int] = []
mutating func append(_ item: Int) {
items.append(item)
}
}
struct StringContainer: Container {
var items: [String] = [] // Swift фаҳмид, ки Item = String
mutating func append(_ item: String) {
items.append(item)
}
}
Мумкин аст, ки маҳдудиятҳо ба намудҳои тавсифшуда илова карда шаванд, масалан, талаб кардан, ки он ба протоколи дигар мувофиқат кунад:
protocol ComparableContainer {
associatedtype Element: Comparable // Element бояд Comparable бошад
var elements: [Element] { get set }
}