Sobes.tech
Junior

Кадом принсипи барномаи имкон медиҳад, ки генерикҳоро истифода баранд?

sobes.tech AI

Ҷавоб аз AI

Полиморфизм по типам.

Генерикҳо дар Swift полиморфизми параметриро амалӣ мекунанд, ки имкон медиҳад, ки код нависед, ки бо намудҳои гуногун кор кунад, бидуни пешакӣ донистани онҳо, аммо талаб мекунад, ки ин намудҳо ба маҳдудиятҳои муайян (масалан, протоколҳо) ҷавобгӯ бошанд.

Масали истифодаи генерикҳо:

// Тартиби функсияи генерикӣ, ки ду параметри якхелаи навъи T мегирад,
// ки дар он навъи T бояд ба протоколи Equatable мувофиқат кунад.
func areEqual<T: Equatable>(_ a: T, _ b: T) -> Bool {
    return a == b
}

// Истифодаи функсияи генерикӣ бо Int
let intResult = areEqual(5, 5) // true

// Истифодаи функсияи генерикӣ бо String
let stringResult = areEqual("hello", "world") // false

Масали сохтори генерикӣ (стек):

// Тартиби сохтори генерикӣ "Stack", ки метавонад унсурҳои ҳар гуна навъи T-ро нигоҳ дорад.
struct Stack<T> {
    private var elements: [T] = []

    mutating func push(_ element: T) {
        elements.append(element)
    }

    mutating func pop() -> T? {
        return elements.popLast()
    }
}

// Истифодаи сохтори генерикӣ бо Int
var intStack = Stack<Int>()
intStack.push(1)
intStack.push(2)
let poppedInt = intStack.pop() // 2

// Истифодаи сохтори генерикӣ бо String
var stringStack = Stack<String>()
stringStack.push("A")
stringStack.push("B")
let poppedString = stringStack.pop() // "B"

Манфиатҳои истифодаи генерикҳо:

  • Бехатарии намуд: Компилятор намудҳоро дар вақти компиляция санҷида, эҳтимолияти хато дар вақти иҷрои кам мекунад.
  • Истифодаи такрорӣ: Код якхела метавонад бо намудҳои гуногун кор кунад.
  • Кам кардани вақти иҷрои: Нигоҳ доштани намудҳо дар вақти иҷрои зарурат нест.
  • Абстраксия: Иҷозат медиҳад, ки аз намудҳои маълумоти мушаххас абстраксия кардан мумкин аст.