Sobes.tech
Junior — Middle

Өзүнүн чектөөсүнөн чыгууга мүмкүндүк берген жана мүмкүн эмес болгон жабдыктар арасындагы негизги айырманы түшүндүрүңүз.

sobes.tech AI

AIден жооп

iOS (Swift/Objective-C) ичинде, жабуулар (closures) сырткы чөйрөдөн өзгөрмөлөрдү кармап кала алат. Алардын негизги айырмасы — алардын өз чөйрөсүнөн чыгышы мүмкүн же мүмкүн эместиги, жашоо мөөнөтү жана контекстти кармоо менен байланыштуу:

  • Чыгышы мүмкүн болгон жабуулар — бул объекттер, сырткы контексттен өзгөрмөлөргө шилтемелерди кармап, аларды сактап калат, ошондуктан бул өзгөрмөлөрдү оригиналдуу чөйрө аяктагандан кийин да колдонсо болот. Бул жабуулар көбүнчө мүнөздөмөлөрдө сакталат, callback катары өткөрүлөт жана башка.

  • Чыгышы мүмкүн эмес жабуулар — бул сакталбаган же контекстти кармаган эмес, же ошол эле чөйрөдө гана колдонулган жабуулар. Алар кийинчерээк чакырылбайт, анткени контекст алгачкы эле жок кылынган.

Мисал:

func makeIncrementer(amount: Int) -> () -> Int {
    var total = 0
    let incrementer: () -> Int = {
        total += amount
        return total
    }
    return incrementer
}

let inc = makeIncrementer(amount: 5)
print(inc()) // 5
print(inc()) // 10

Бул жерде, incrementer жабуусу total жана amount өзгөрмөлөрүн кармап, аларды сактап калат, ошондуктан аларды оригиналдуу функциядан тышкары колдонсо болот. Эгер ал контекстти кармабаса же сакталбаса, ал иштебейт эле.