Middle
дар бораи рӯйхати тасвир дар Swift гап зан.
sobes.tech AI
Ҷавоб аз AI
Дар Swift барои идора кардани ошкоро ёфтан ва нигоҳ доштани тағйирёбандаҳо дар зери назорати маҳкам, истифодаи рӯйхати захиравии (capture list) мебошад. Ин кӯмак мекунад, ки гирдоби қавӣ (strong reference cycles) пешгирӣ карда шаванд, махсусан дар ҳолате, ки бо self дар дохили зери назоратҳои истифода мешаванд, ки дар синфҳо истифода мешаванд. Намудҳои асосии захиравӣ: weak ва unowned.
| Навъи захиравӣ | Тавсиф | Вақте истифода бурдан мумкин аст |
|---|---|---|
weak |
Тағйирёбандаро ҳамчун интихоб (optional) мегирад, наметавонад шуморо афзоиш диҳад. Қимати он метавонад nil шавад. |
Вақте, ки объекти зери назорат метавонад аз объекте, ки он захиравӣ мекунад, гузарад. |
unowned |
Тағйирёбандаро бе афзоиши шумораи ишораҳо мегирад, аммо фикр мешавад, ки объекте, ки захиравӣ мешавад, то ҳол зинда хоҳад монд, то ки зери назорат тамом шавад. Ин интихоб нест. | Вақте, ки зери назорат ва объекте, ки захиравӣ мешавад, як вақт зиндагӣ мекунанд, ва объекте, ки захиравӣ мешавад, то анҷоми зери назорат nil намешавад. |
Синтаксиси рӯйхати захиравӣ:
{ [capture list] (параметрҳо) -> навъ баргардонед in
// код
}
Масалан, истифодаи weak self:
class MyClass {
var value = 0
func doSomethingLater() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in
guard let self = self else { return } // Санҷиши nil
self.value += 1
print("Меъёри ҳозир \(self.value)")
}
}
}
Масалан, истифодаи unowned self:
class ViewController: UIViewController {
var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button = UIButton(type: .system)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
}
@objc func buttonTapped() {
// `unowned self` дар ин ҳолат зарур нест, зеро тугма то ҳол вуҷуд дорад, то ки ViewController вуҷуд дорад.
// Аммо агар зери назорат метавонад аз ViewController гузарад, unowned метавонад мувофиқ бошад, агар мо боварӣ дошта бошем,
// ки self нопадид намешавад.
let action = { [unowned self] in
self.view.backgroundColor = .blue
}
action()
}
}
Мумкин аст, ки на танҳо self-ро, балки дигар тағйирёбандаҳоро, ки дар зери назорат дастрасанд, захира кард. Масалан, барои нигоҳ доштани қимати тағйирёбанда дар вақти эҷоди зери назорат:
func createIncrementer(initialValue: Int) -> () -> Int {
var currentValue = initialValue
return { [initialValue] in // Захира кардани initialValue бо қимат
currentValue += 1
print("Қимати ибтидоӣ буд \(initialValue)") // initialValue қимати худро нигоҳ медорад
return currentValue
}
}
let incrementer = createIncrementer(initialValue: 5)
print(incrementer()) // Натиҷа: Қимати ибтидоӣ буд 5, пас 6
print(incrementer()) // Натиҷа: Қимати ибтидоӣ буд 5, пас 7