Sobes.tech
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 }
}